質問内容が本質と少しズレていたのでトピック立て直しました。すみません。 キャラクターのアニメーションをSPANIMを使って表現する際に、SPANIMがWHILEループ内で繰り返し処理されるのを防ぐために、例えば変数Aを用意し、 IF A==1 THEN SPANIM IF A==1 THEN A=2 と書くことでA==1を1フレームの時間を判定するフラグにしてSPANIMが一回だけ処理されるようにしているのですが、この他に何か良い考えがないか、皆さんのアイデアをお聞きしたいです。
コメント
Soybeanman2018/10/27 14:38◆SDLkyXUP6WqK
SPCHKを使う手があります。 使っているアニメーション番号=SPCHK(SP番号) 戻り値に関してはhttp://petitcom.net/manual/spchk で確認できます。 これを使えば IF !(SPCHK(0)AND 1) THEN SPANIM 0,"XY"… と一行で完結できます。
Soybeanmanさん しんいちさん 返信ありがとうございます! もっと詳しく質問すべきでした。申し訳ないです。 ゲーム中の処理、つまりWHILEループ内での処理に応じたキャラクターの絵(SPRITEの定義番号)の変化をどう表現するかを尋ねてみた感じです。 例えばキャラが歩いている絵のアニメからジャンプする絵のアニメに切り替える際に WALKとかJPといった変数を用意して、 IF 歩かせる処理 THEN WALK=1 ELSE WALK=0 IF WALK==1 THEN SPANIM歩きアニメ IF WALK==1 THEN WALK==2
IF ジャンプする処理 THEN JP=1 IF JP==1 THEN SPANIMジャンプアニメ IF JP==1 THEN JP=2 IF 着地処理 THEN JP=0 と、歩いている状態からジャンプすると歩きSPANIMがジャンプSPANIMに上書きされるよーといった具合にしているのですが あんまりスマートな方法に見えない気がしてきてトピックを立てました。
本題とは外れるかもなのでとりあえずですが、 IF WALK==1 THEN SPANIM歩きアニメ IF WALK==1 THEN WALK==2 に関しては自分なら最低限 IF WALK==1 THEN SPANIM歩きアニメ:WALK=2 と1行にまとめますね。 (例題のWALK==2はイージーミスだと思うので気にしないでいます)
でんぺんさん IF WALK==1 THEN SPANIM :WALK=2 にするとWALK==1のタイミングが存在しなくなると思い込んでました。(PRINT命令の置き所が悪かったせいでWALKが0→2に変化するように見えていました) 訂正ありがとうございます! ところで二行に分かれているのと一行にまとめるのとでは、一連の処理(WALKに1が代入されてSPANIMを実行し、WALKに2が代入されるまで)の速度は異なるのでしょうか?すこし気になります。 bit演算についてはこの場では見送ろうと思います。アドバイスありがとうございます。
Soybeanman2018/10/27 18:59◆SDLkyXUP6WqK
でんぺんさんではないですが回答。 一行にまとめた場合、 IF WALK==1 THEN SPANIM…:WALK=2 二行の場合、 IF WALK==1 THEN SPANIM… IF WALK==1 THEN WALK=2 となりますね。 IF文の処理時間は0ではないため、一行にまとめた方がIF文を処理する回数が1回で速くなるでしょう。 しかし、一行で書ききると見難いため、同じ処理速度でこういう書き方ができます。 IF WALK==1 THEN SPANIM… WALK=2 ENDIF 途中で空白が文の最初に入っています。これはインデントと言い、プログラムを見やすくするものです。 昔のBASICでは空白を入れることで処理時間が生じましたが、プチコンでは処理時間が生じないようです。 インデントを入れるかどうかは本人の好みですが、入れた方がいいと思います。
ちなみに書き方にもよりますが1行に収める場合、その行での実行順は基本左からになりますが、その順番が処理に影響を与えない場合は見やすさを重視して並び替える事もあります。つまり、 IF WALK==1 THEN SPANIM:WALK=2 か IF WALK==1 THEN WALK=2:SPANIM の違いですが、SPANIMは実際は引数が多いので後者の方が変数を変えてアニメーションをする、という流れが読みやすい可能性があります。前者の場合はSPANIMの長い引数を読んでからじゃないと変数変更が出てこないので、見づらく感じる可能性があるかなと。
VAR ST,STB'フラグ REPEAT VSYNC STB=ST ST=BUTTON() IF ST!=STB THEN IF ST AND(#LEFT OR #RIGHT)THEN SPAMIN '歩くやつ IF ST AND #A THEN SPANIM 'ジャンプ ENDIF UNTIL FALSE