今回は前回までに問題のあった箇所、変更したほうが良い箇所の改善を行います。 まずは、ゲーム起動して1回目の1問目だけしか「入力ボックスにフォーカスが当たっていない」問題について。 2問目以降もオブジェクトを全て消した後に表示させているので、 「なぜ1回目の1問目だけはフォーカスが当たっているのか?」という疑問が沸きますが、 とりあえず「オブジェクト表示させた後に入力ボックスにフォーカスを当てる」ことで問題は解決できるので 以下の7行目のように追加修正しておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
*game_answer color 255, 255, 255 : boxf : color font msmincho, 15 pos 10, 10 : mes "合計値を入力してください。" pos 10, 40 : input answer, 100, 20 pos 10, 70 : button gosub "解答", *click_button objsel 0 font msmincho, SIZE / 3 * 2 click = 0 repeat 10, 1 wait 100 if click : break redraw 0 color 255, 255, 255 : boxf (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 : color circle (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2, (ginfo_winx + SIZE) / 2, (ginfo_winy + SIZE) / 2 color 255, 255, 255 circle (ginfo_winx - SIZE + 15) / 2, (ginfo_winy - SIZE + 15) / 2, (ginfo_winx + SIZE - 15) / 2, (ginfo_winy + SIZE - 15) / 2, 0 pos (ginfo_winx - SIZE / 3) / 2, (ginfo_winy - SIZE / 3 * 2) / 2 mes 10 - cnt redraw 1 loop font msmincho, 15 return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#define SIZE 250 #module #deffunc countdown int count, local i click@ = 0 i = ginfo_winx - SIZE@, ginfo_winy - SIZE@, ginfo_winx + SIZE@, ginfo_winy + SIZE@ font msmincho, SIZE@ / 3 * 2 repeat , 1 if click@ ! 0 | cnt = count : break if count { redraw 0 color 255, 255, 255 : boxf i.0 / 2, i.1 / 2 if count - cnt > 3 : color : else : color 255 circle i.0 / 2, i.1 / 2, i.2 / 2, i.3 / 2 pos (ginfo_winx - SIZE@ / 3 * 2) / 2, (ginfo_winy - SIZE@ / 3 * 2) / 2 mes count - cnt color 255, 255, 255 circle (i.0 + 15) / 2, (i.1 + 15) / 2, (i.2 - 15) / 2, (i.3 - 15) / 2, 0 pos (ginfo_winx - ginfo_mesx) / 2, (ginfo_winy - ginfo_mesy) / 2 mes count - cnt redraw 1 } wait 100 loop return #global num = 3, 4, 5 koma = 50 objsize 100, 25 randomize mmload "error.wav", 0 mmload "correct.wav", 1 |
1 2 3 4 5 6 7 8 9 10 11 12 |
*game_draw clrobj countdown 3 // 3秒間の準備時間 font msmincho, SIZE foreach question color 255, 255, 255 : boxf : color , 150 wait 10 pos (ginfo_winx - SIZE / 2) / 2, (ginfo_winy - SIZE) / 2 mes question.cnt wait koma loop return |
1 2 3 4 5 6 7 8 9 10 |
*game_answer color 255, 255, 255 : boxf : color font msmincho, 15 pos 10, 10 : mes "合計値を入力してください。" pos 10, 40 : input answer, 100, 20 pos 10, 70 : button gosub "解答", *click_button objsel 0 countdown 10 // 10秒間のカウントダウンを行う font msmincho, 15 return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
*game_judge clrobj color 255, 255, 255 : boxf : color pos 10, 10 : mes "入力:" + answer.0 pos 10, 30 : mes "正解:" + answer.1 pos 10, 60 : button gosub "次へ", *click_button font msmincho, SIZE, 1 pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 if answer.0 ! answer.1 { color 255 mes "×" mmplay 0 } else { color , , 255 mes "○" mmplay 1 } countdown // ボタンが押されるまで無限ループ stage++ return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
*game_draw clrobj color 255, 255, 255 : boxf : color font msmincho, 15 pos 10, 10 : mes "第 " + (stage + 1) + " / " + length(num) + " 問目" pos 10, 30 : mes "表示数 " + num.stage + "個 pos 10, 50 : mes strf("%1.2f 秒 / コマ", 0.01 * koma) countdown 3 font msmincho, SIZE foreach question color 255, 255, 255 : boxf : color , 150 wait 10 pos (ginfo_winx - SIZE / 2) / 2, (ginfo_winy - SIZE) / 2 mes question.cnt wait koma loop return |
1 2 3 4 5 6 7 8 9 10 |
*game_main stage = 0 truth = 0 // 正解率算出用 foreach num gosub *game_init gosub *game_draw gosub *game_answer gosub *game_judge loop goto *init |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
*game_judge truth += answer.0 = answer.1 // 正解なら1を足す「if answer.0 = answer.1 : truth++」と一緒 stage++ // 率を算出するために個の位置に移動しておく clrobj color 255, 255, 255 : boxf : color pos 10, 10 : mes "入力:" + answer.0 pos 10, 30 : mes "正解:" + answer.1 pos 10, 50 : mes "正答率 " + strf("%2.2f %", 100.0 * truth / stage) pos 10, 80 : button gosub "次へ", *click_button font msmincho, SIZE, 1 pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 if answer.0 ! answer.1 { color 255 mes "×" mmplay 0 } else { color , , 255 mes "○" mmplay 1 } countdown return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 |
*game_judge truth += answer.0 = answer.1 stage++ clrobj color 255, 255, 255 : boxf : color pos 10, 10 : mes "入力:" + answer.0 pos 10, 30 : mes "正解:" + answer.1 pos 10, 50 : mes "正答率 " + strf("%2.2f %", 100.0 * truth / stage) pos 10, 80 : button gosub "次へ", *click_button pos 80, 30 : mes "(" pos length(question) * 30 + 75, 30 : mes ")" foreach question if cnt : pos cnt * 30 + 75, 30 : mes "+" pos cnt * 30 + 90, 30 : mes question.cnt loop font msmincho, SIZE, 1 pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 if answer.0 ! answer.1 { color 255 mes "×" mmplay 0 } else { color , , 255 mes "○" mmplay 1 } countdown return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 |
*game_judge truth += (answer.0 = answer.1) * click stage++ clrobj color 255, 255, 255 : boxf : color pos 10, 10 : mes "入力:" + answer.0 pos 10, 30 : mes "正解:" + answer.1 pos 10, 50 : mes "正答率 " + strf("%2.2f %", 100.0 * truth / stage) pos 10, 80 : button gosub "次へ", *click_button if click = 0 : pos 90, 10 : mes "( 時間切れ )" // 時間切れであることを示す pos 80, 30 : mes "(" pos length(question) * 30 + 75, 30 : mes ")" foreach question if cnt : pos cnt * 30 + 75, 30 : mes "+" pos cnt * 30 + 90, 30 : mes question.cnt loop font msmincho, SIZE, 1 pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 if answer.0 ! answer.1 | click = 0 { color 255 mes "×" mmplay 0 } else { color , , 255 mes "○" mmplay 1 } countdown return |
1 2 3 4 5 6 7 |
num = 3, 4, 5 koma = 50 objsize 100, 25 onkey gosub *push_key randomize mmload "error.wav", 0 mmload "correct.wav", 1 |
1 2 3 |
*push_key if wparam = 13 : gosub *click_button // エンターキーが押されたらボタン押下と同じ効果とする return |
1 2 3 4 |
*init clear pos 10, 10 : button gosub "開始", *click_button countdown // ボタン押下またはエンターキーで先に進むよう変更 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#deffunc countdown int count, local i click@ = 0 i = ginfo_winx - SIZE@, ginfo_winy - SIZE@, ginfo_winx + SIZE@, ginfo_winy + SIZE@ font msmincho, SIZE@ / 3 * 2 repeat , 30 if click@ ! 0 | cnt / 30 = count : break if count ! 0 & cnt \ 30 = 0 { // 30ループ(約1秒)に1回だけ画面書換 redraw 0 color 255, 255, 255 : boxf i.0 / 2, i.1 / 2 if count - cnt / 30 > 3 : color : else : color 255 circle i.0 / 2, i.1 / 2, i.2 / 2, i.3 / 2 pos (ginfo_winx - SIZE@ / 3 * 2) / 2, (ginfo_winy - SIZE@ / 3 * 2) / 2 mes count - cnt / 30 color 255, 255, 255 circle (i.0 + 15) / 2, (i.1 + 15) / 2, (i.2 - 15) / 2, (i.3 - 15) / 2, 0 pos (ginfo_winx - ginfo_mesx) / 2, (ginfo_winy - ginfo_mesy) / 2 mes count - cnt / 30 redraw 1 } await 33 loop return |
1 2 3 |
*push_key if wparam = 13 : gosub *click_button : else : wait 1 // エンターキー以外は余分にウェイトを掛ける return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
*game_judge truth += (answer.0 = answer.1) * click stage++ clrobj color 255, 255, 255 : boxf : color pos 10, 10 : mes "入力:" + answer.0 pos 10, 30 : mes "正解:" + answer.1 pos 10, 50 : mes "正答率 " + strf("%2.2f %", 100.0 * truth / stage) pos 10, 80 : button gosub "次へ", *click_button if click = 0 : pos 90, 10 : mes "( 時間切れ )" pos 90, 30 : mes "(" pos length(question) * 30 + 85, 30 : mes ")" foreach question if cnt : pos cnt * 30 + 85, 30 : mes "+" pos cnt * 30 + 100, 30 : mes question.cnt loop font msmincho, SIZE, 1 tmp = "×○" color (answer.0 ! answer.1 | click = 0) * 255, , (answer.0 = answer.1) * click * 255 pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 mes strmid(tmp, (answer.0 = answer.1) * click * 2, 2) mmplay (answer.0 = answer.1) * click countdown return |
1 2 3 4 5 |
#deffunc clear clrobj color 255, 255, 255 : boxf : color font msmincho, 15 return |
1 2 3 4 |
*init clear pos 10, 10 : button "開始", *game_main stop |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
*game_draw clear pos 10, 10 : mes "第 " + (stage + 1) + " / " + length(num) + " 問目" pos 10, 30 : mes "表示数 " + num.stage + "個 pos 10, 50 : mes strf("%1.2f 秒 / コマ", 0.01 * koma) countdown 3 // 3秒間の準備時間 font msmincho, SIZE foreach question color 255, 255, 255 : boxf : color , 150 wait 10 pos (ginfo_winx - SIZE / 2) / 2, (ginfo_winy - SIZE) / 2 mes question.cnt wait koma loop return |
1 2 3 4 5 6 7 8 |
*game_answer clear pos 10, 10 : mes "合計値を入力してください。" pos 10, 40 : input answer, 100, 20 pos 10, 70 : button gosub "解答", *click_button objsel 0 countdown 10 return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
*game_judge truth += (answer.0 = answer.1) * click stage++ clear pos 10, 10 : mes "入力:" + answer.0 pos 10, 30 : mes "正解:" + answer.1 pos 10, 50 : mes "正答率 " + strf("%2.2f %", 100.0 * truth / stage) pos 10, 80 : button gosub "次へ", *click_button if click = 0 : pos 90, 10 : mes "( 時間切れ )" pos 90, 30 : mes "(" pos length(question) * 30 + 85, 30 : mes ")" foreach question if cnt : pos cnt * 30 + 85, 30 : mes "+" pos cnt * 30 + 100, 30 : mes question.cnt loop font msmincho, SIZE, 1 tmp = "×○" color (answer.0 ! answer.1 | click = 0) * 255, , (answer.0 = answer.1) * click * 255 pos (ginfo_winx - SIZE) / 2, (ginfo_winy - SIZE) / 2 mes strmid(tmp, (answer.0 = answer.1) * click * 2, 2) mmplay (answer.0 = answer.1) * click countdown return |