; リズムゲームサンプル ; byシフトアップネット ; ご自由にスクリプトを改造して使用してください ; 変数設定 ------------------------------------------------------------------------------------------ SUU_ARY_TARGET = 6 ; 致命的エラーが出る場合増やす MAX_ARY_TARGET < SUU_ARY_TARGET - 1 KEY = 38 39 40 37 ; ↑→↓←キー ;MAX_CNT = 21 ; 1小節の秒数×12fps(この曲の場合1.75秒×12=21) ; しかし処理落ちしたので20フレームにしてみた MAX_CNT = 20 MAX_ZURE = 3 ; 小さいほど難しい(0以上、最低間隔未満) MAX_TARGET_POS = 6 MIN_TARGET_POS < MAX_TARGET_POS * -1 ; キー、間隔、キー、間隔・・・・という配列。キーは0から4まで。それぞれ上、右、下、左、ランダム。最後は-1 ; 4拍子で21フレームだと割り切れないので、5,5,5,6というふうに変則的な間隔で調整した ;ARY = 0 20 1 20 3 9 2 10 0 20 4 20 4 9 4 10 4 9 4 10 4 9 0 10 0 9 2 4 2 5 2 9 3 10 3 9 1 4 2 5 0 9 4 10 4 9 4 4 4 5 4 9 4 10 4 9 4 10 4 9 4 4 4 40 -1 ; しかし処理落ちしたので20フレームにしてみた ARY = 0 19 1 19 3 9 2 9 0 19 4 19 4 9 4 9 4 9 4 9 4 9 0 9 0 9 2 4 2 4 2 9 3 9 3 9 1 4 2 4 0 9 4 9 4 9 4 4 4 4 4 9 4 9 4 9 4 9 4 9 4 4 4 40 -1 ; 背景種類 MP_IMG_NM = "sougen1_1b" "kawa1_2b" "sabaku1_3b" "mroad1_1b" "hill1_2b" "sougen5_1b" "umi1_2b" MAX_IMG_BACK = 6 ; 背景種類数-1 ; 準備 ------------------------------------------------------------------------------------------ ; このゲームの場合、演奏中にタイムラグが発生すると困るので、 ; ロードするものは先に全てロードしておく msg サウンドロード中・・・ . loads B16_040 ; BGMとしてでなく、SEとして最初に読み込んでおく clear msg 画像ロード中・・・ . wk0 = 100 for i = 0 to MAX_ARY_TARGET load "abyss2.png" grpTarget[i] wk0 ;paint grpTarget[i] wk0 + 1 endfor load "abyss.png" grpCenter 20 paint grpCenter clear ; 初期処理 ------------------------------------------------------------------------------------------ hi_sc = 0 ; SUU_ARY_TARGET以上の配列 ary_key = -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ary_cnt = 0 0 0 0 0 0 0 0 0 0 ary_sumi = 0 0 0 0 0 0 0 0 0 0 ; チェック済み ; タイトル ------------------------------------------------------------------------------------------ *title score = 0 cntGood = 0 cntBad = 0 text リズムゲーム サンプル *ハイスコア:$hi_sc$ . menu arg0 ゲームスタート ハイスコアクリア endmenu if arg0 = 1 then end ; 終了すると、最初からになるので、結果的にハイスコアがクリアされる endif clear rand MAX_IMG_BACK arg0 load $MP_IMG_NM[arg0]$ grpBack 10 fit grpBack paint grpBack wipe isEnd = 0 sound B16_040 ixAry = -1 cntKankaku = 0 *loop gosub main wait 1 if isEnd = 0 goto loop stopm if score > hi_sc then hi_sc = score endif text 今回のスコア:$score$  ハイスコア:$hi_sc$ . erase grpBack wipe clear goto title ; メイン処理 ------------------------------------------------------------------------------------------ *main msg 1 20 20 80 3 FFFFFF FF0000 FF0000 center Bad $cntBad$ . msg 2 430 20 80 3 FFFFFF 0000FF 0000FF center Good $cntGood$ . ; 押されているキーチェック key wKey ;if wKey = 32 then ; 32=スペースキー ; isEnd = 1 ;endif ; 次のターゲット出現させるか cntKankaku - 1 if cntKankaku < 0 then ixAry + 1 if ARY[ixAry] < 0 then isEnd = 1 else arg0 = ARY[ixAry] gosub addTarget ixAry + 1 cntKankaku = ARY[ixAry] endif endif ; 移動中の全ターゲット処理 for i = 0 to MAX_ARY_TARGET if ary_key[i] >= 0 then ; 1つ処理 ary_cnt[i] - 1 if ary_cnt[i] < 0 then ; ゴール到達 isBad = 1 ; チェック必須 else isBad = 0 endif if ary_sumi[i] = 0 then if ary_cnt[i] <= MAX_ZURE then ; キーチェック isGood = 0 wk0 = ary_key[i] if wKey = KEY[wk0] then isGood = 1 endif if isGood > 0 then msg Gooooooooooood!!! . ary_sumi[i] = 1 score + 100 cntGood + 1 else if wKey != 0 then ; 間違ったキー isBad = 1 endif if isBad > 0 then msg Bad... . ary_sumi[i] = 1 cntBad + 1 endif endif endif endif if ary_cnt[i] < 0 then ; ゴール到達 erase grpTarget[i] ary_key[i] = -1 else ; 移動 if ary_key[i] = 0 then x = 0 y = MAX_TARGET_POS else if ary_key[i] = 1 then x = MIN_TARGET_POS y = 0 else if ary_key[i] = 2 then x = 0 y = MIN_TARGET_POS else if ary_key[i] = 3 then x = MAX_TARGET_POS y = 0 endif move grpTarget[i] x y paint grpTarget[i] endif endif endfor return ; ターゲットを1つ追加(arg0=上下左右)------------------------------------------------------------------------------------------ *addTarget ; 空いてるか for i = 0 to MAX_ARY_TARGET if ary_key[i] < 0 then ; 空いてた if arg0 = 4 then ; ランダム rand 3 arg0 endif ary_key[i] = arg0 ary_cnt[i] = MAX_CNT ary_sumi[i] = 0 ; 初期位置 if ary_key[i] = 0 then x = 0 y < ary_cnt[i] * MIN_TARGET_POS else if ary_key[i] = 1 then x < ary_cnt[i] * MAX_TARGET_POS y = 0 else if ary_key[i] = 2 then x = 0 y < ary_cnt[i] * MAX_TARGET_POS else if ary_key[i] = 3 then x < ary_cnt[i] * MIN_TARGET_POS y = 0 endif move grpTarget[i] x y return endif endfor ; 空いてなかった 致命的エラー return