;Main.hsp
;イメトレ!
;2018/11/28
;珍獣戦記
title "イメトレ!"
;音声;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#epack "./voice/0.wav"
#epack "./voice/1.wav"
#epack "./voice/2.wav"
#epack "./voice/3.wav"
#epack "./voice/4.wav"
#epack "./voice/5.wav"
#epack "./voice/6.wav"
#epack "./voice/7.wav"
#epack "./voice/8.wav"
#epack "./voice/9.wav"
#define hVOICE0 0
#define hVOICE1 1
#define hVOICE2 2
#define hVOICE3 3
#define hVOICE4 4
#define hVOICE5 5
#define hVOICE6 6
#define hVOICE7 7
#define hVOICE8 8
#define hVOICE9 9
mmload "./voice/0.wav", hVOICE0
mmload "./voice/1.wav", hVOICE1
mmload "./voice/2.wav", hVOICE2
mmload "./voice/3.wav", hVOICE3
mmload "./voice/4.wav", hVOICE4
mmload "./voice/5.wav", hVOICE5
mmload "./voice/6.wav", hVOICE6
mmload "./voice/7.wav", hVOICE7
mmload "./voice/8.wav", hVOICE8
mmload "./voice/9.wav", hVOICE9
;定数と変数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;入力系
#define KEY_NUM 16 ;キーの数
#define UP_KEY 10 ;↑
#define DOWN_KEY 11 ;↓
#define ENTER_KEY 12 ;ENTER
#define SPACE_KEY 13 ;SPACE
#define ESC_KEY 14 ;ESC
#define F12_KEY 15 ;F12
dim PushKey, KEY_NUM ;キーが入力されてるか読み込むための変数
dim KeyCode, KEY_NUM ;キーコド
dim tmpKey, KEY_NUM ;入力フレーム数
UpPusingCounter = 0 ;↑押しっぱなしカウンター
DownPusingCounter = 0 ;↓押しっぱなしカウンター
;シーン
#define GAME_TITLE 0 ;桁数選択
#define NUM_VOICE 1 ;数字読み上げ
#define NUM_INPUT 2 ;数字入力
Scene = GAME_TITLE ;シーン
;数列
#define DIGIT_MAX 32 ;最大桁数
dim Num, DIGIT_MAX ;数列
dim Num2, DIGIT_MAX ;数列2
DigitNum = 5 ;桁数
VoiceCount = 0 ;声カウンタ
;ゲーム;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GameMain
;ゲームメイン関数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc GameMain
randomize ;乱数初期化
InitKey ;入力系初期化
;メインループ
repeat
redraw 0 ;描画の反映をOFF
MyGetKey ;入力系
switch Scene
case GAME_TITLE ;タイトル(桁数選択)
Digit
swbreak
case NUM_VOICE ;数字読み上げ
NumVoice
swbreak
case NUM_INPUT ;数字入力
NumInput ;未実装
swbreak
default
swbreak
swend
EndGame ;F12で終了
redraw 1 ;描画を反映させる
await 16 ;一定時間待つ
loop
return
;桁数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc Digit
color 255, 255, 255 ;色を白にする
boxf ;画面全体を塗りつぶす
pos 0, 16
color 255, 0, 0
font "MS 明朝", 16, 1
mes "『イメトレ!』\n\n"
color 0, 64, 0
mes "↑↓キーで桁数選択\nENTERでトレーニングスタート"
pos (640 - 128) >> 1, 176
color 0, 0, 255
font "MS 明朝", 64, 1
mes strf("%2d桁", DigitNum)
pos 0, 480 - 16 * 10
color 0, 64, 0
font "MS 明朝", 16, 1
mes "【解説】\n「イメージ能力」を鍛えるゲームです。\n「音声」で読み上げられた複数桁の「数字」をイメージで記憶し、\n「逆の順序」で答えます。\n\n桁数は1〜32まで指定できます。最初は5桁くらいで、慣れたら\n徐々に増やして行きましょう。"
SelectDigit ;桁数調整
if tmpKey(ENTER_KEY) == 1 { ;ENTERが押されたら
MakeNum ;問題作成
VoiceCount = 0 ;声カウンタ初期化
Scene = NUM_VOICE ;シーン移行
}
return
;問題作成;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc MakeNum
repeat DIGIT_MAX ;数列を-1でとりあえず初期化
Num(cnt) = -1
Num2(cnt) = -1
loop
repeat DigitNum ;桁の数だけ数列を作る
Num(cnt) = rnd(10)
loop
return
;数字読み上げ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc NumVoice
color 0, 0, 255 ;色を白にする
boxf ;画面全体を塗りつぶす
;↓↓↓コメントアウトなら問題なし問題なし↓↓↓;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if VoiceCount < DigitNum { ;声カウンタが桁の数未満なら
mmplay Num(VoiceCount) ;音声再生
VoiceCount++
}
else { ;全て読み上げたら
Scene = NUM_INPUT ;シーン移行
}
;↑↑↑コメントアウトなら問題なし問題なし↑↑↑;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
if tmpKey(ESC_KEY) == 1{ ;ESCでタイトル
Scene = GAME_TITLE
}
return
;数字入力;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc NumInput
;未実装;
return
;入力系初期化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc InitKey
repeat KEY_NUM - 6 ;0〜9
KeyCode(cnt) = 48 + cnt ;KeyCodeに0(48)〜9(57)まで入れる
loop
KeyCode(UP_KEY) = 38 ;↑
KeyCode(DOWN_KEY) = 40 ;↓
KeyCode(ENTER_KEY) = 13 ;ENTER
KeyCode(SPACE_KEY) = 32 ;SPACE
KeyCode(ESC_KEY) = 27 ;ESC
KeyCode(F12_KEY) = 123 ;F12
repeat KEY_NUM ;0で初期化
tmpKey(cnt) = 0 ;全く入力されていない
loop
return
;入力フレーム数格納;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc MyGetKey
repeat KEY_NUM
getkey PushKey(cnt), KeyCode(cnt) ;キー入力チェック
if PushKey(cnt) = 1 { ;押されている
tmpKey(cnt)++ ;カウンタ++
}
else {
tmpKey(cnt) = 0 ;カウンタ0
}
loop
return
;桁数セレクト;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc SelectDigit
if tmpKey(UP_KEY) > 0 { ;↑押しっぱなしなら
UpPusingCounter++ ;押しっぱなしカウンターを増加
}
else {
UpPusingCounter = 0 ;そうでない時は0
}
if tmpKey(DOWN_KEY) > 0 { ;↓押しっぱなしなら
DownPusingCounter++ ;押しっぱなしカウンターを増加
}
else {
DownPusingCounter = 0 ;そうでない時は0
}
;たった今押された」または「押しっぱなしカウンター > 30」」かつ「↓が押されていない」
if (tmpKey(UP_KEY) == 1 || UpPusingCounter > 30) && tmpKey(DOWN_KEY) == 0 {
if UpPusingCounter > 30 { ;30カウンター以上押しっぱなしならカウンターを27へ
UpPusingCounter = 27 ;オートの場合4回に1回下に下がる
}
DigitNum++ ;桁数++
if DigitNum > DIGIT_MAX { ;上限にきたら下限へ
DigitNum = 1
}
}
;「たった今押された」または「押しっぱなしカウンター > 30」」かつ「上キーが押されていない」
if (tmpKey(DOWN_KEY) == 1 || DownPusingCounter > 30) && tmpKey(UP_KEY) == 0 {
if DownPusingCounter > 30 { ;30カウンター以上押しっぱなしならカウンターを27へ
DownPusingCounter = 27 ;オートの場合4回に1回下に下がる
}
DigitNum-- ;桁数--
if DigitNum < 1 { ;下限にきたら上限へ
DigitNum = DIGIT_MAX
}
}
return
;ゲーム終了;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#deffunc EndGame
if tmpKey(F12_KEY) >= 1 : end
return
これが最初の1音だけ再生されて、ESCも受け付けません。F12は受け付けます。
全く理由が分かりません。どなたか詳しい方、アドバイス頂けませんでしょうか?