コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
あんちもん ◆8qCJSJ1bKTIQ
2018/10/27 11:53
情報交換
SPANIMの繰り返しを防ぐ
質問内容が本質と少しズレていたのでトピック立て直しました。すみません。
キャラクターのアニメーションをSPANIMを使って表現する際に、SPANIMがWHILEループ内で繰り返し処理されるのを防ぐために、例えば変数Aを用意し、
IF A==1 THEN SPANIM
IF A==1 THEN A=2
と書くことでA==1を1フレームの時間を判定するフラグにしてSPANIMが一回だけ処理されるようにしているのですが、この他に何か良い考えがないか、皆さんのアイデアをお聞きしたいです。

コメント

アバター
Soybeanman 2018/10/27 14:38 ◆SDLkyXUP6WqK
SPCHKを使う手があります。
使っているアニメーション番号=SPCHK(SP番号)
戻り値に関してはhttp://petitcom.net/manual/spchk で確認できます。
これを使えば
IF !(SPCHK(0)AND 1) THEN SPANIM 0,"XY"…
と一行で完結できます。
アバター
しんいち 2018/10/27 15:20 ◆lHy.hAWXbthn
本当に一回だけで良いのなら、WHILEループの直前に一度だけSPANIMを実行すれば良いと思います。
アバター
あんちもん 2018/10/27 16:20 ◆8qCJSJ1bKTIQ
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に上書きされるよーといった具合にしているのですが
あんまりスマートな方法に見えない気がしてきてトピックを立てました。
アバター
Soybeanman 2018/10/27 16:28 ◆SDLkyXUP6WqK
フラグを一つにまとめてみてはいかがでしょうか?
例なら、
WALKの部分で2bit、JPの部分で2bit、合計4bit使って変数で表せば変数の数は減るかと。
アバター
あんちもん 2018/10/27 16:57 ◆8qCJSJ1bKTIQ
Soybeanmanさん
「合計4bit使って変数で表す」というのは、
ある変数Aを用意して、
A==0: 歩いていない ==1:歩いている
==2:ジャンプしていない ==3:ジャンプしている
といった感じで定義するということでしょうか?
確かに変数の個数を減らすにはフラグをまとめる必要がありますね。
アバター
Soybeanman 2018/10/27 17:03 ◆SDLkyXUP6WqK
そうですね。合っていると思います。
例の場合だと0,1,2を使っているので、
歩いていない=&B0000=0
歩き始め=&B0001=1
歩いている=&B0010=2
ジャンプしていない=&B0000=0
ジャンプ始め=&B0100=4
ジャンプしている=&B1000=8
とできます。
こうすることで一つの変数で歩きフラグとジャンプフラグが共存できます。
アバター
でんぺん 2018/10/27 17:30 ◆HfSy5ayxtyTa
本題とは外れるかもなのでとりあえずですが、
IF WALK==1 THEN SPANIM歩きアニメ
IF WALK==1 THEN WALK==2
に関しては自分なら最低限
IF WALK==1 THEN SPANIM歩きアニメ:WALK=2
と1行にまとめますね。
(例題のWALK==2はイージーミスだと思うので気にしないでいます)

ちょっと追伸:
Soybeanmanさんのやり方はbitで管理するので2進数の考え方がわからないとちゃんと理解出来ないと思いますので、その辺に不安がある場合は質問して補完するか今回は見送るかした方がいいと思います。
アバター
あんちもん 2018/10/27 18:26 ◆8qCJSJ1bKTIQ
Soybeanmanさん
度々ありがとうございます!まとめられるフラグとそうでないフラグを一度見直してみようと思います。

でんぺんさん
IF WALK==1 THEN SPANIM :WALK=2
にするとWALK==1のタイミングが存在しなくなると思い込んでました。(PRINT命令の置き所が悪かったせいでWALKが0→2に変化するように見えていました)
訂正ありがとうございます!
ところで二行に分かれているのと一行にまとめるのとでは、一連の処理(WALKに1が代入されてSPANIMを実行し、WALKに2が代入されるまで)の速度は異なるのでしょうか?すこし気になります。
bit演算についてはこの場では見送ろうと思います。アドバイスありがとうございます。
アバター
Soybeanman 2018/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では空白を入れることで処理時間が生じましたが、プチコンでは処理時間が生じないようです。
インデントを入れるかどうかは本人の好みですが、入れた方がいいと思います。
アバター
でんぺん 2018/10/27 19:13 ◆HfSy5ayxtyTa
Soybeanmanさんが回答してくれているので僕もその補足だけ…。

ENDIFを使った複数行にする場合は、僕もインデントを入れた方が見やすくていいと思います。

ちなみに1行にすること自体は、この程度であれば問題ないと思います。ただ1行に書いたときに自動改行などが入ってしまう(つまり画面として1行に収まらない)場合はENDIFを使って複数行にした方が見やすいのでそっちを推奨します。
(もしかしたらSPANIMは引数が多くて自動改行が入る可能性があるので、その場合はENDIFの複数行の方がいいです)

ちなみに書き方にもよりますが1行に収める場合、その行での実行順は基本左からになりますが、その順番が処理に影響を与えない場合は見やすさを重視して並び替える事もあります。つまり、
IF WALK==1 THEN SPANIM:WALK=2

IF WALK==1 THEN WALK=2:SPANIM
の違いですが、SPANIMは実際は引数が多いので後者の方が変数を変えてアニメーションをする、という流れが読みやすい可能性があります。前者の場合はSPANIMの長い引数を読んでからじゃないと変数変更が出てこないので、見づらく感じる可能性があるかなと。

まあでもこれも引数の内容によって変わるので、それほど気にならない程度なら順番を入れ替えなくても問題ないですし、あくまで状況や感覚による、ぐらいの感じですけどね。
アバター
しんいち 2018/10/27 19:18 ◆lHy.hAWXbthn
キャラクターの状態を示すフラグを、変更前、変更後の2つ用意して、それらを比較して変化した時だけ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

雰囲気だけ。実際にはSTはBUTTON()だけでは決まらないと思いますので。
アバター
あんちもん 2018/10/27 20:11 ◆8qCJSJ1bKTIQ
Soybeanmanさん でんぺんさん
とても詳しい解説ありがとうございます。思ったより融通がきくんですね。見やすくまとまったプログラムを書くよう心がけます!

しんいちさん
変数に変数を代入する手がありましたね!
ずっと前にでんぺんさんのプログラムで見かけていたはずなのですが、すっかり盲点でした。やはりプログラミングは実際に書いて動かさないと身につきませんね。

皆さんご丁寧に答えてくださり大変感謝しています。ひとまずここまで出た意見を元にプログラムを考えてみようと思います!ご協力ありがとうございました!

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -