■やりたいこと
一言で言えば「沢山ある変数を初期化したい」
STGでゲーム中にポーズ画面からタイトルに戻ったとき、
自機、敵、ボスなどの変数を一括で初期化(0)にしたいです。
過去記事やネットで調べると配列変数がいいと書かれてますが、
配列変数の場合、メインのソースの変数名も変えないとだめだと思います。
ゲームの場合変数名は多いのでどうにかして効率的にやりたいですが、
やはり配列変数を使うしかないのでしょうか。
■ミニソースの仕様
・エンターキー:押すと現在の変数名で初期化する
・スペースキー:押すと配列変数で初期化する
■ソースに関して
*初期化
~~
~~~~
goto *メイン
*配列変数初期化
一応先に言っておきますが、メインソースではこんなラベルの置き方はしません。
あくまでサンプルソースとしてわかりやすいようにおいてあるだけです。
ただ「初期化」に関してはメインソースの処理に近いです。
;*************自機関連******************
~~
~~~~
if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動
return
ここら辺が実際に動かしているソースの一部です。
ゲームなんで実際は多く、タイトル込みで8000行ぐらいあります。
#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,498 ;スプライト有効エリア設定 ;---自機--- ;自機 JIKISpd = 4 ;移動スピード es_size 28,42, 100 es_pat 350, 0,0 ;自機が動ける範囲 ;--上-- es_size 383,3 es_pat 10, 0,0 es_set 10, 30,11, 10 ;--左-- es_size 3,450 es_pat 11, 0,0 es_set 11, 30,11, 11 ;--下-- es_size 383,3, 100 es_pat 12, 0,0 es_set 12, 30,460, 12 ;--右-- es_size 3,450 es_pat 13, 0,0 es_set 13, 411,11, 13 ;配列変数 dim JIKI_RIRET,3 ;*********初期化********* *初期化 JIKI_x = 256 : JIKI_y = 390 if K_P = 1 { ;エンター押したら【実行】 K_P = 0 ;エンター押した JI_MUTE_f = 0 ;自機無敵フラグ MT_TAIM = 0 ;無敵時間 JIKI_G_c = 0 ;無敵グラフィックカウント goto *メイン } *配列変数初期化 JIKI_x = 256 : JIKI_y = 390 if K_S = 1 {;スペースキーを押したら【実行】 K_S = 0 ;スペースキーを押した JIKI_RIRET(0) = 0 JIKI_RIRET(1) = 0 JIKI_RIRET(2) = 0 } ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;***********カウンター*************** pos 420,20 : es_mes "自機無敵フラグ " + JI_MUTE_f pos 420,40 : es_mes "無敵時間 " + MT_TAIM pos 420,60 : es_mes "無敵グラフィック " + JIKI_G_c pos 420,90 : es_mes "JIKI_RIRET(0) " + JIKI_RIRET(0) pos 420,110 : es_mes "JIKI_RIRET(1) " + JIKI_RIRET(1) pos 420,130 : es_mes "JIKI_RIRET(2) " + JIKI_RIRET(2) ;*************メインループ**************** gosub *自機の移動 gosub *デバック用 ;**********デバッグ用カウンター増加******** ;疑似カウンター JI_MUTE_f += 1 if MT_TAIM <= 50 : MT_TAIM += 2 if JIKI_G_c <= 150 : JIKI_G_c += 3 ;配列変数 JIKI_RIRET(0) += 1 if JIKI_RIRET(1) <= 50 : JIKI_RIRET(1) += 2 if JIKI_RIRET(2) <= 150 : JIKI_RIRET(2) += 3 ;*************自機関連****************** ;自機 es_set 350, JIKI_x,JIKI_y, 350 ;無敵の点滅 if JI_MUTE_f = 1 { ;自機無敵フラグが「立ったら実行」 if MT_TAIM <= 260 { ;約4秒間無敵 if JIKI_G_ca >= 3502 : JIKI_G_ca = JIKI_P_MOTO ;キャラクタNoの番号を「リセット」 es_set JIKI_P_MOTO, JIKI_x,JIKI_y, JIKI_P_MOTO ;スプライトNo, X,Y座標 ,キャラNo es_chr JIKI_P_MOTO, JIKI_G_ca ;p1=スプライトNo、p2=キャラクタNo JIKI_G_c++ ;グラフィックカウント if JIKI_G_c >= 30 : JIKI_G_c = 0 : JIKI_G_ca++ ;キャラクタを増加する MT_TAIM += 1 ;点滅の時間 if MT_TAIM >= 260 { ;4秒間無敵 JIKI_HIT_f = 0 ;自機着弾フラグ「初期化」 MT_TAIM = 0 ;点滅の時間「初期化」 JIKI_G_c = 0 ;自機グラフィックカウント「初期化」 JI_MUTE_f = 0 ;自機無敵フラグ「初期化」 } } } es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動************* *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return ;*****デバック用****** *デバック用 getkey key_P,13 ;エンターキー if key_P { ;キーが押されたら実効 if K_P = 0 { K_P = 1 goto *初期化 } } else { K_P = 0 } ;スペースキー stick keyS,16 if keyS { K_S = 1 goto *配列変数初期化 } return