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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0321
アイドル【hspdxfix.as】変数を一括で初期化したい5解決


アイドル

リンク

2022/3/21(Mon) 19:55:03|NO.95794

hspdxfix.asプラグインで作ったSTGゲームになります!


■やりたいこと
一言で言えば「沢山ある変数を初期化したい」

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



この記事に返信する


す²

リンク

2022/3/21(Mon) 20:18:39|NO.95795

初期化が必要なセーブファイルと不必要なセーブファイルを分けて、必要なセーブファイルの中身を
何らかの方法で削除すればいいのではないですかね?



アイドル

リンク

2022/3/22(Tue) 09:11:19|NO.95799

す²さん回答ありがとうございます。

>初期化が必要なセーブファイルと不必要なセーブファイルを分けて、
>必要なセーブファイルの中身を何らかの方法で削除
初期化が必要という情報をその変数に指定しなきゃいけないので、
結局変数名を拾ってこないとダメだと思いますね。

変数名は現在少なくっても50個はあるので・・・
けれどセーブを分けるっていう発想はありませんでした!

以前別の処理で使ったやつがもしかしたら使えるかもなので調べてきます。



hspfun

リンク

2022/3/22(Tue) 22:38:28|NO.95810

正確に質問の意図を理解できていないかもしれないですが
まず、下記は恐らく普通に配列変数を使った初期化の例です。

dim st,5 ;0=LV 1=Exp 2=HP 3=Power 4=Guard *main st.1++ ;経験値取得 if st.1 >= 100{ ;レベルアップ st.0++ st.2+ = rnd(50) st.3+ = rnd(10) st.4+ = rnd(10) st.1=0 } getkey Enter,13 if Enter{ ;初期化 repeat 5 st(cnt)=0 loop } redraw 0 ;描画 cls mes "LV."+st.0+" Exp:"+st.1 mes "HP:"+st.2+" Power:"+st.3+" Guard:"+st.4 redraw 1 await 16 goto *main
配列変数の長所はそれぞれの変数に番号が割り振られているので
repeatとcntで一括して処理できる事です。
しかし "ゲームの場合変数名は多い" と仰る通りで
何番がなんの数値か分からなくなるので、dimの下にメモ書き等残します。
それでも分かり難いので、下記の様な方法もあるかもしれません。

dim st,5 #const LV 0 ;constで配列変数の番号に名前をつける #const Exp 1 #const HP 2 #const Power 3 #const Guard 4 *main st.Exp++ ;経験値取得 if st.1 >= 100{ ;レベルアップ st.LV++ st.HP += rnd(50) st.Power += rnd(10) st.Guard += rnd(10) st.Exp = 0 } getkey Enter,13 if Enter{ ;初期化 repeat 5 st(cnt)=0 loop } redraw 0 ;描画 cls mes "LV."+st.LV+" Exp:"+st.Exp mes "HP:"+st.HP+" Power:"+st.Power+" Guard:"+st.Guard redraw 1 await 16 goto *main
#constはマクロの一種で、指定した名前を数値に置き換えます。
#const LV 0と指定すると、メインプログラムの中でst.0とst.LVは同義になります。
ただし、ここで使用された名前は配列での指定以外では使えなくなります。
(LV=0等をプログラム中に記述すると、0=0として扱われエラーになります。)

既に現在開発されているプログラムで扱われている大量の変数をなんとかしたい
という事でしたら、残念ですが配列変数などに手動で置き換えるか
初期化用のサブルーチンを作ってgosubで飛ばすしかないと思います。
プログラム中で使用されている変数の一覧については、エディタからの実行時に
Debugウィンドウを表示にチェックを入れる事で確認できます。



アイドル

リンク

2022/3/23(Wed) 14:42:34|NO.95821

hspfunさん返答ありがとうございます!
大体解釈通りです・・!

>しかし "ゲームの場合変数名は多い" と仰る通りで
>何番がなんの数値か分からなくなるので、dimの下にメモ書き等残します。
>それでも分かり難いので、下記の様な方法もあるかもしれません。
こんな方法があるんですね。
最初っからこの方針で作ればよかったですね・・・


>ただし、ここで使用された名前は配列での指定以外では使えなくなります。
そんなルールがあったんですね。


>既に現在開発されているプログラムで扱われている大量の変数をなんとかしたい
>という事でしたら、残念ですが配列変数などに手動で置き換えるか
>初期化用のサブルーチンを作ってgosubで飛ばすしかないと思います。
>プログラム中で使用されている変数の一覧については、エディタからの実行時に
>Debugウィンドウを表示にチェックを入れる事で確認できます。
ゲームスタート→初期化にジャンプすることにしました。
これなら以前やったことあるし一番安全そうです。

そういえばDebugウィンドウにありましたね。
配列変数もなんか事故りそうな気もするので、手打ちで初期化することにします。
ありがとうございます。!!

うん・・!構築する前に考慮すべきだったなぁ・・・

;■■■■ゲーム内初期化■■■■ ;システム GEMU_IJI_SUKOA = 0 ;イージースコア GEMU_NOMARU_SUKOA = 0 ;ノーマルスコア P_TOKU_f = 0 ;パチュリーの特殊能力フラグ AI_JIKAI_c = 0 ;自動回収ラインの文字 ZANK = 0 ;残機 PW_KZ = 0 ;パワー数 GURE_kazu = 0 ;グレイズ数 ESC_Zkey_f = 0 ;EESでZキーチェックカウントフラグ ESC_KAIWA_c = 0 ;ESC会話カウント



アイドル

リンク

2022/3/26(Sat) 07:35:24|NO.95844

解決に入れ忘れたのでチエック!



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