今回は前回までに問題のあった箇所、変更したほうが良い箇所の改善を行います。 まずはタイトル部分の操作方法についての修正から。 プレイ画面はマウスで操作するのに、 タイトル画面はキーボードで操作するというのはイマイチです。 タイトル画面もマウスだけで操作できるように修正しますが、 せっかくキーボード操作もできるのだから、 キーボード操作もできるままにした方が操作の幅が広がって良いと思うので、 キーボード操作はそのままに、マウス操作機能を追加しましょう。
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 34 35 36 |
*menu index = 0 gosub *draw_menu i = 0, 0 // マウスカーソル座標位置の変更確認用一時変数 repeat wait 5 stick key if key & 2 : index-- : if index < 0 : index = length(item) - 1 if key & 8 : index++ : if index >= length(item) : index = 0 if key & 10 : gosub *draw_menu // マウス座標が変わればカーソル位置の座標がメニュー上かを確認する if i.0 ! mousex | i.1 ! mousey { i = mousex, mousey foreach item i.2 = (ginfo_winy - 230) / length(item) * cnt + 200 if i.0 > 200 & i.0 < 440 & i.1 > i.2 & i.1 < i.2 + 40 { index = cnt gosub *draw_menu break } loop } // メニューの決定ボタンは32(エンターキー) or 256(クリック) if key & 288 { switch index case 0: gosub *game_start gosub *draw_menu swbreak default: break swend } loop 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 |
*game_main title strf("%s (残り:%d)", NAME, moved - moved.1) repeat wait 1 stick key if key & 271 { // 256(クリック) + 1(左キー) + 2(上キー) + 4(右キー) + 8(下キー) if (key & 1) ! 0 & space \ numx.stage ! numx.stage - 1 : i = space + 1 if (key & 2) ! 0 & space / numx.stage ! numy.stage - 1 : i = space + numx.stage if (key & 4) ! 0 & space \ numx.stage ! 0 : i = space - 1 if (key & 8) ! 0 & space / numx.stage ! 0 : i = space - numx.stage if key & 256 : i.0 = mousex / SX + mousey / SY * numx.stage i.1 = (i - 1 = space) & (i \ numx.stage ! 0) i.2 = (i - numx.stage = space) & (i / numx.stage ! 0) i.3 = (i + 1 = space) & (i \ numx ! numx.stage - 1) i.4 = (i + numx.stage = space) & (i / numx.stage ! numy.stage - 1) if i.1 | i.2 | i.3 | i.4 { tip.space = tip.space ^ tip.i tip.i = tip.space ^ tip.i tip.space = tip.space ^ tip.i space = i moved.1++ title strf("%s (残り:%d, 手数:%d)", NAME, moved - moved.1, moved.1) gosub *draw_map gosub *clear_check if clear : break } } loop return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
*draw_map redraw 0 color 255, 255, 255 : boxf repeat numx.stage * numy.stage pos cnt \ numx.stage * SX, cnt / numx.stage * SY if cnt = space | (key & 512) ! 0 { // 空きマス or 右クリック時はうっすら表示 gmode 3, SX, SY, 20 gcopy 2, cnt \ numx.stage * SX, cnt / numx.stage * SY gmode 3, SX, SY, 256 continue } gcopy 2, tip.cnt \ numx.stage * SX, tip.cnt / numx.stage * SY, SX, SY loop redraw 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 25 26 27 28 29 30 31 32 33 34 |
*game_main title strf("%s (残り:%d)", NAME, moved - moved.1) repeat wait 1 stick key, 512 // 完成図表示用に右クリックは押しっ放しを許可 if key & 271 { if (key & 1) ! 0 & space \ numx.stage ! numx.stage - 1 : i = space + 1 if (key & 2) ! 0 & space / numx.stage ! numy.stage - 1 : i = space + numx.stage if (key & 4) ! 0 & space \ numx.stage ! 0 : i = space - 1 if (key & 8) ! 0 & space / numx.stage ! 0 : i = space - numx.stage if key & 256 : i.0 = mousex / SX + mousey / SY * numx.stage i.1 = (i - 1 = space) & (i \ numx.stage ! 0) i.2 = (i - numx.stage = space) & (i / numx.stage ! 0) i.3 = (i + 1 = space) & (i \ numx ! numx.stage - 1) i.4 = (i + numx.stage = space) & (i / numx.stage ! numy.stage - 1) if i.1 | i.2 | i.3 | i.4 { tip.space = tip.space ^ tip.i tip.i = tip.space ^ tip.i tip.space = tip.space ^ tip.i space = i moved.1++ title strf("%s (残り:%d, 手数:%d)", NAME, moved - moved.1, moved.1) gosub *draw_map gosub *clear_check if clear : break } } else { if ((key & 512) ! 0 & i ! -1) | ((key & 512) = 0 & i = -1) { gosub *draw_map if key & 512 : i = -1 : else : i = 0 } } loop return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
*game_start stage = 0 foreach numx space = 0 clear = 0 moved = 0, 0 gosub *draw_tips gosub *shuffle gosub *draw_stagetitle // ステージタイトル描画 gosub *draw_map gosub *game_main gosub *game_clear if clear = 2 : continue cnt loop dialog "Stages All Clear !\n\nThank you for Playing." return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
*draw_stagetitle i = ginfo_winx, -150, -150 color 255, 200, 255 : boxf repeat 80 stick key if key & 288 : break // 32(エンターキー) or 256(クリック) でタイトルスキップ redraw 0 color 255, 200, 255 : boxf , 50, , 430 : color font msmincho, 80, 1 pos i.0, 50 : mes strf("ステージ%d", stage + 1) color , , 255 font msmincho, 50, 1 pos i.1, 250 : mes strf("%d×%dマス", numx.stage, numy.stage) pos i.2, 350 : mes strf("手数残%d", moved) redraw 1 i.0 -= abs(cos(M_PI * cnt / 64) * 25) i.1 += abs(cos(M_PI * cnt / 64) * 20) i.2 += abs(cos(M_PI * cnt / 64) * 20) wait 2 loop return |