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

アバター
あんちもん ◆8qCJSJ1bKTIQ
2018/3/29 6:20
協力
BGを用いた着地の処理と、SPANIM命令で困っています
1.プレイヤーキャラ(の足元の判定)がBGに触れている間、プレイヤーキャラのY座標がBGとの接触部分以下にならないようにする。(着地処理)
2.プレイヤーキャラが着地している間、プレイヤーキャラに待機アニメを表示させる。
以上の2つを両立させたく思っているのですが、
IF BGGET(BGとの当たり判定)!=0 THEN SPANIM 待機アニメーション
これをWHILEループ内に入れるとSPANIM命令が繰り返され、キャラ絵が止まってしまいます。
そこで、このプログラムを見ていただきたいのですが…
公開キー【QKHDPEC3】

コメント

アバター
あんちもん 2018/3/29 6:45 ◆8qCJSJ1bKTIQ
このプログラムではプレイヤーのY座標の変化を、重力方向への加速度を表す変数をAとし、これを用いて行っています。
Aボタンを押すと、Aに−5.5が代入され、キャラが空中にいる間(これは別の変数LANDで判定しています)Aに0.25を加算し続ける。
このあとY=Y+Aの処理で、加速度に応じてY座標を変化させます。
今、質問文の1、2を実現するため、
IF BGGET(BGと足元の判定)!=0 THEN Y=Y−A:A=0
で着地した瞬間プレイヤーのY座標を固定し、
'STAND 0:待機アニメ開始 1:待機アニメ再生中
'LAND 0:着地していない 1:着地開始 2:着地している
IF STAND==0 THEN SPANIM 待機アニメーション
 IF STAND==0 THEN STAND=1
IF BGGET(BGと足元の判定)!=0 THEN LAND=1
 IF LAND==1 THEN LAND=2:STAND=0
で待機アニメーションを再生しています。
しかしこれにはいくつか問題があり、
問題点1 
SPANIMが繰り返されるのを防ぐため、Y座標(とそれに伴う足元のBGとの当たり判定)をBGに接触しない位置で固定しているが、これでは足元の判定がBGと接触していないときに落下する(Y座標に正のAの値が加算される)表現ができない。
問題点2
Aの値によって、固定するY座標が様々な値をとってしまい、BGと接触しないギリギリの位置に綺麗に固定することができない。

この問題を解決するため、皆さんの手を貸していただきたいです。
アバター
でんぺん 2018/3/29 7:48 ◆HfSy5ayxtyTa
ちょっと見てみましたがキャラがオリジナル(大きい)のでアニメーションの見栄えが良いですね〜。良い感じだと思います。

問題点は言われているように問題点2のY座標の位置が固定化されてないところですね。なので問題点2が解決すれば問題点1は自ずと解決する(足下の座標が固定化してわかるようになるので)って感じですよね。

と言うことでBGにぶつかったとき、その位置から正確に座標補正してBGの上に乗せることが出来れば問題は解決します。
BGは今回の場合は16ドット単位のブロックなのでスプライトの座標を16で割れば(小数点切り捨て)BGの座標になります。そして、そのBGの座標からスプライトの位置を計算して調整してY座標を決めてあげれば、きちんとした位置に補正することが出来ます。
例えばシンプルに今はY=Y-AのところをY=FLOOR((Y+55)/16)*16-56とするだけでも良い感じに補正されるんじゃないかな? 最後に-56しているのはキャラの位置に調整するためですが-55だと補正直後にまた地面に当たることになるので1ドット上にしてあげています。

一応そんな感じですが、他にも左右移動時の判定なども正確にしないと正しく補正されない(いきなりブロックの上に乗るとか)しちゃいますが、要領は同じ感じで出来るのでチャレンジしてみてください!

オマケでSPDEFする時に今は原点が全部キャラの右上ですが例えばキャラの中央足下を原点にするとかすると座標計算がしやすくなったりしますよ。左右で加算する数値の差が変わることもなくなりますしね。
アバター
moi 2018/3/29 9:21 ◆hL/XpFV8MD2F
IF BGGET(当たり判定) THEN
IF !FLAG THEN SPANIM 待機アニメーション:FLAG=1
ENDIF

IF ! BGGET(当たり判定) THEN FLAG=0

でもいけそう。
アバター
ツララ 2018/3/29 10:50 ◆ArUdBYOYME1V
座標が接地点以下に行かない様にしたいなら、接地ラインにしたいY座標を取りあえずLAND_LINE、略してLLみたいな適当な変数で設定しておいて
毎フレームの座標計算時に
接地してるかどうかの判定フラグをA_FLAG、T_FLAGが1フレーム前のA_FLAGの状態を保存しておくフラグだとして

Y=Y+A
T_FLAG=A_FLAG
IF Y>=LL THEN A_FLAG=TRUE ELSE A_FLAG=FALSE
Y=Y-(Y MOD LL)
IF !T_FLAG && A_FLAG THEN SPANIM ~

みたいな処理を入れてみたらいいんじゃないです?
平らな地面と当たり判定を取りたいだけなら、別にBGの情報取得に拘らなくても良いと思いますけど。
アバター
Villit 2018/3/29 11:10 ◆vHS9PZuQvtOx
基本的にでんぺんさんの言ってる方法で大丈夫だと思います。

ただ「座標を16で割って小数点以下を切り捨てる」という方法は「スクロール」がある場合あまりオススメできません。
BGOFS 0,0の状態では16ドットごとにBGの境目がある状態なのでそれでもいいんですが、BGOFS 0,1にするともちろん1ドットズレます。そこの補正を加えないといけないのでやや面倒です。
16で割らずにBGCOORDを使って変換するのがオススメ。

(ただ、プレイヤー座標を画面外まで考慮する形で管理しているなら16切り捨てで問題ないです)
アバター
でんぺん 2018/3/29 11:25 ◆HfSy5ayxtyTa
>Villlitさん
たしかにスクロールも加味するとその分座標修正が増えるので面倒になりますね。
BGCOORDはその点命令に任せられるので活用すれば便利ですね。
今回はY座標だけしか試さなかったのでスクロールがなくてチェックを見落としました…。
アバター
あんちもん 2018/3/29 21:09 ◆8qCJSJ1bKTIQ
でんぺんさん villitさん
上下方向へのスクロールも実装予定です。言及し忘れてすみません。
めり込み補正のアイデアありがとうございます!
moiさん
IF文の中にIF文、そして論理反転の演算子ですか!
まだ見慣れないので、自分ではこの様な解答は思いつけませんでした。ぜひ参考にさせていただきます。
ツララさん
段差や穴の地形の表現を考慮すると、Y=LLといった直線ではなく、幅の決められた線分でないといけないと考えました。そして、マップ毎に線分の位置や幅を設定し、その判定に合わせてBGキャラを配置するのであれば、始めからBGキャラとの判定を作り、BGキャラを壁、地面、天井として扱ってしまう方が楽だと思いました。BGキャラを置くだけで壁や地面が作れるので、ステージ作りをする上でも効率的だと思うのですが、どうでしょうか?
アバター
あんちもん 2018/3/29 21:21 ◆8qCJSJ1bKTIQ
moiさんのプログラムを参考にしたところ、プレイヤーキャラの判定とBGキャラが接触しつつ、待機アニメを再生させることができました!
自分としてはこちらのほうがより理想的な挙動なので、待機アニメ再生はこの方法で行おうと思います。
依然としてスクロール込みのめり込み補正の問題点が残っていますが、皆さんから頂いたアイデア、ヒントを元に頑張って作ってみようと思います。
一番悩んでいたBGとの接触とアニメーションの両立が可能になったので、非常に助かりました。
皆さんの優しさには痛み入るばかりです。本当にありがとうございます。
アバター
moi 2018/3/30 8:51 ◆hL/XpFV8MD2F
だいじょーぶだいじょーぶ
僕だってたくさん質問に答えたいし。

論理式はホントに便利だよ
例えばBUTTON()関数で自機を動かすプログラムも

B=BUTTON()
X=X-(B==4)+(B==8)
Y=Y-(B==1)+(B==2)
に縮められるし。
アバター
でんぺん 2018/3/30 9:14 ◆HfSy5ayxtyTa
進んでいるようで良かったです!

プログラムを見た全体的なアドバイスというか僕が思ったのは、

1. IFのブロック(IF〜ENDIF)をあまり使っていないけど:で繋げて1行でやるよりもIFブロックを使った方が見やすくなったり効率が上がりそうな部分が多かった。

2, SPDEFを移動方向が変わったときなどに都度変更していたが、SPDEFはプログラムの始めに定義して利用する(後で変更しない)方が利用しやすいです。つまり反転した絵もあらかじめSPDEFで別の番号に登録しておく事になります。
(デフォルトで用意されている素材がそのような構成になっています)

3. 入力値を毎回IFでBUTTON()と書いて調べるよりも事前にB=BUTTON()として変数に入れておいてIFではそれを参照する方がシンプルで見やすくなります。
とくにBUTTONの値はVSYNCや一定時間しないと変化しないので変数に入れておいて参照する方が早いです。

と言うのがすぐに思ったことかな。
まあでも始めのうちは動かすのが大事で形にこだわらずに進めた方が進めやすいところもあると思うので、一応書きましたが楽しんでプログラムをする方を優先してください!
アバター
あんちもん 2018/3/30 12:51 ◆8qCJSJ1bKTIQ
アドバイスありがとうございます!
でんぺんさん
2のSPDEF命令については、今後追加するプレイヤーの動きや敵キャラのグラフィックを描くことを考えると、今詰められる余白を考慮しても、グラフィックページに反転した絵を描く余裕がなくなりそうなのでこのような処理にしています。
アバター
でんぺん 2018/3/31 0:07 ◆HfSy5ayxtyTa
SPDEFはグラフィックページに反転した絵を描かなくて大丈夫ですよ!
SPDEFで定義するときにアトリビュートというのがあるので、それで横反転させて定義することが出来ますよ!

SPDEFのテンプレート定義番号は0〜4095までなのでそれ以上のパターンを作ろうとしたら定義が足りなくなるので切り替える必要がありますが、そうじゃなければ同じ画像を使って反転回転加算合成なんでもありなので便利だと思いますよ。同じ絵で原点を変えることも出来るので、剣を振るときにちょっと上に跳ねるような動き(位置)にするとか躍動感もつけやすいです。

この辺はもともとのサンプルが色々やってる(反転や原点を変えただけとか)ので見てみると参考になるんじゃないかなと思います。
アバター
でんぺん 2018/3/31 8:15 ◆HfSy5ayxtyTa
SPDEFについては論より証拠というか例を見た方がわかりやすい気もしたので、ちょっと時間が作れたのでサンプルを作ってみました。
公開キー:Q3FDP3JD
SPDEF_SAMPLEを実行してみてください。グラフィックはそのまま使わせてもらって左右移動だけのアニメテストです。SPDEFで始めに定義するだけってのがわかると思います。

SPANIMはせっかくなのでDATAを使った指定方法を試してみましたが別に直の書き方でも問題ありません。アニメ速度的な数値はオリジナルに合わせたわけじゃないので適当です。

オマケで僕が前に作ったPUCHI-VIEWというプログラムをいれました。これはSPDEFで定義されているスプライトやBGを確認するだけのツールです。僕はスマイルツールに登録していますが、例えばスロット1などに読み込んでおいてRUN 1としても実行出来るので現在定義したSPDEFを確認出来ます。スマイルツールと比べて見ることに特化してシンプルなので使ってみてくださいな。

とりあえずそんな感じでした。
アバター
あんちもん 2018/3/31 9:12 ◆8qCJSJ1bKTIQ
定義番号はスプライトの個数よりもずっと多く定義できるんでしたね!うっかりしていました。
考え直してみると、今の自分のやりかたではプレイヤーと同じ姿の敵とかを出したくなった時に困りそうですね。
こちらの方がずっとコンパクトにまとまっていますし、一回プログラムを組み直してみようと思います(ちょっと後回しになりそうですが…)。
ツールもありがたく頂戴しておきます!

コメントを書く

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

- WEB PATIO -