HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1128
珍獣士wavファイルの再生がうまくいかないです3解決


珍獣士

リンク

2018/11/28(Wed) 02:08:48|NO.85894

ゲームプログラムの経験はあるのですが(三流未満)、HSPは全くの
ド素人です。この度、HSPの勉強として、単純な脳トレゲームを作ろうとしているのですが。

仕様を簡単に説明すると、

「ランダムに生成された数字の列を音声で読み上げ、それを逆さまに入力していく」

というもの。

まだ、逆さまに入力するところは作ってないのですが、音声再生のところで
詰まっています。で、自分なりに色々試しました。以下は一応動きます。


#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 dim Num, 10 VoiceCount = 0 randomize MakeNum ;メインループ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; repeat NumVoice wait 90 loop ;問題作成;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc MakeNum repeat 10 Num(cnt) = rnd(10) loop return ;数字読み上げ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc NumVoice color 0, 0, 255 ;色を白にする boxf ;画面全体を塗りつぶす if VoiceCount < 10 { mmplay Num(VoiceCount) VoiceCount++ } return

次の投稿に続きます



この記事に返信する


珍獣士

リンク

2018/11/28(Wed) 02:12:26|NO.85895


;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は受け付けます。
全く理由が分かりません。どなたか詳しい方、アドバイス頂けませんでしょうか?



法貴優雅

リンク

2018/11/28(Wed) 20:07:55|NO.85897

ご自身で作られたサンプルを見る限り、原因がわかっているような気がするのですが?

>最初の1音だけ再生されて
これはawait16だけしか、ウェイトがないため、16msで次の音声が再生されているためです。
実際は最後の数字だけ、読み上げられています。

>ESCも受け付けません。
これもScene=NUM_VOICEが、5フレームで終了して、次のNUM_INPUTに
ないっていますが、中身が未実装なので、ESCでタイトルに戻る処理が
入っていないためです。

>F12は受け付けます。
F12は全シーンで動作するため、問題なく動作します。


デバッグウィンドウやlogmesなどを利用して、デバッグするとよいと思います。



珍獣士

リンク

2018/11/28(Wed) 22:14:21|NO.85899

アドバイスありがとうございます!

いえいえ、全然解っていませんでした!

何とか解決したのでソースを一部


;数字読み上げ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #deffunc NumVoice color 0, 0, 255 ;色を青にする boxf ;画面全体を塗りつぶす if VoiceCount < DigitNum { ;声カウンタが桁の数未満なら mmstat VoiceState, Num(VoiceCount), 16 if VoiceState == 0 && VoiceWait == 0 { mmplay Num(VoiceCount) ;音声再生 } else { VoiceWait++ if VoiceWait > WAIT_MAX { VoiceWait = 0 VoiceCount++ } } } else { ;全て読み上げたら Scene = NUM_INPUT ;シーン移行 } if tmpKey(ESC_KEY) == 1{ ;ESCでタイトル Scene = GAME_TITLE } return

本当にありがとうございました!それでは失礼します



ONION software Copyright 1997-2023(c) All rights reserved.