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

アバター
あんちもん ◆8qCJSJ1bKTIQ
2019/4/26 22:30
質問
BGとの接触判定、めり込み補正について
作成中のアクションゲーム(2Dのマリオやロックマン系)で、マップの端まではプレイヤーキャラを画面中央に固定し、BGをスクロールさせて移動を表現する処理を作り直しています。
現在マップ端以外での床のめり込み補正の処理にBGのY座標をFLOORで16の倍数に矯正する方法を取っているのですが、スクロールを加味する場合これはあまり良くないとのご指摘を何度か頂きました(スクロールによりBGのY座標が16の倍数でなくなるため?)。
しかしスクロールを考えた時どのような補正処理が適しているのかよくわかりません。
以前は条件式を調整して、不都合なとき(例えばBGのY座標が15の時にこれが割る16で切り捨てられ0になるなど)は補正を行わないようにしてなんとか違和感ない動作に見せていたのですが、一度見直したいです。

コメント

アバター
あんちもん 2019/4/26 22:31 ◆8qCJSJ1bKTIQ
もう一つ別件で、プログラムを見ていただきたいのですが、マップ端でプレイヤーのY座標を直接変化させる時とマップ端以外でプレイヤーを固定し、BGをスクロールさせる時でジャンプ高度が6ドットほど変わるといった現象が起きています。プレイヤーの足元の座標がBG床から離れている際に、プレイヤーにかかる重力変数Gを0.25ずつ加算しているのですが、加算が始まるタイミングがマップ端かそうでないかでずれているようです。どちらの場合も床から足元が離れるタイミングは同じになるよう組んだつもりなのですが、何がいけないのかわかりません。
本題をまとめると、
1.プレイヤーを固定し、BGのスクロールをする時に適した座標補正処理を教えてほしい
2.マップ端かそうでないかでジャンプ高度が変わる原因を見てほしい
です。
【解決につき公開停止しました!】
操作は十字ボタンで左右移動、Aボタンでジャンプです。(Lでダッシュ)
アバター
あきと 2019/4/27 0:47 ◆qGd5dQw2g3a2
画面がスクロールする時としない時でジャンプの高さが変わるのは、キャラクターのY座標と画面の縦スクロールBYが両方変化するからだと思います。
スクロール境界に触れたらキャラクターの縦移動は止まるはずです。
アバター
あんちもん 2019/4/27 8:20 ◆8qCJSJ1bKTIQ
あきとさん
回答ありがとうございます!
PRINT命令でY,BYを確認してみると、
BGが全くスクロールしない場合、最大高度までジャンプしたときBYは0、もしくはマップの幅の上限(公開キーのプログラムでは480)に固定されたままYだけが66変化していて、
BGだけがスクロールする場合、Yは画面中央(120)に固定されたままBYだけが72変化しています。
ジャンプの軌道がスクロール境界をまたぐ場合、YとBYの変化量の和が66〜72くらいの半端な値になる、
という具合なので、少なくともYかBYどちらかしか変化しない前2つの場合においては「YとBYが両方変化している」のが原因とは思えないのですが、どうでしょうか。
(ここでのスクロール境界というのはBYが0、又は480(マップ端)の時のY==120のラインという意味で言っています。)
アバター
あきと 2019/4/27 9:50 ◆qGd5dQw2g3a2
もう少しソース見てみました。
FLOORが多用されてるのが気になります。沢山の箇所でFLOOR(Y+G)もしくはFLOOR(BY+G)されているため小数点以下の数値が切り捨てられています。
ジャンプの計算をすると加速度Gはマイナスからプラスに変化していくときに0の付近で小さい値になりますが、この間の少数点以下の数値を加算した結果も保存しておかないと最終的なジャンプ結果が変わります。
さらにYとBYで変数が2つになることで小数点以下が別々のタイミングで切り捨てられる事でジャンプの高さが変わっていると思われます。
FLOORを取るとYの最小値が62.25、つけると54になります。つけた方がジャンプが高くなるのは切り捨てだけではなく切り上がりも発生しているというの事になる?
アバター
あんちもん 2019/4/27 10:17 ◆8qCJSJ1bKTIQ
Y=FLOOR(Y+G)
BY=FLOOR(BY+G)
の両方の処理を
Y=Y+G
BY=BY+G
に書きかえてみたところ最大ジャンプ時の
Yの変化量は57.75に、BYの変化量は63になりました。確かに高度は下がりますが、差自体は依然として約6ドット分の差なので、FLOORではなくGを加算するタイミングや持続時間、もしくはG=G+0.25の処理のタイミングが原因と思います。
座標BYを変化させる時の
IF Y==120 という条件式が怪しい気もしますが、なぜタイミングに差がでてしまうのか?
アバター
シロ 2019/4/27 11:35 ◆g0oUAxBiWqcj
!BGGET(G+0.25の条件)とBGOFSのタイミングが悪いかな、BGOFSにBYを反映する前に!BGGETを判定する為初回だけG+0.25が動かない。
アバター
シロ 2019/4/27 11:55 ◆g0oUAxBiWqcj
ついでに小数点以下を使った算出はお勧めしません(間接的にFLOORは使わなくてもいい)。割り算に/を使うと小数点以下が出てしまうのでDIVを使った方が良い。なのでGの桁を100倍で算出して使用時に100で割る(DIVで)方がいいです。
アバター
あんちもん 2019/4/27 12:13 ◆8qCJSJ1bKTIQ
シロさん
G=G+0.25の処理をまるごとBGOFSの後ろに移したら、マップ端以外でのジャンプ高度が66になりマップ端の時と同じになりました!
また、副産物的にめり込み補正の挙動がなぜか綺麗に動くようになりました。
多分これもシロさんが指摘されたGの加算するタイミングと、めり込み補正でのBGGET処理とのタイミングの関係と思われます。
当面の問題は解決しました!お二人ともご協力大変感謝致します。
アバター
あんちもん 2019/4/27 12:25 ◆8qCJSJ1bKTIQ
シロさん
そうなんですか。ではGに小数点を使わない処理を一度考えてみようと思います。
小数点が出てしまうと不都合なのはなぜなのでしょうか?なんとなく計算中に誤差が蓄積していくイメージはありますが。
アバター
シロ 2019/4/27 12:31 ◆g0oUAxBiWqcj
リンク(手抜き)で悪いが、具体的には下記例があります。今回の場合0.25を足し続ける過程で誤差が出るかも(最大6.00で止まるから出ないとは思うけど)

http://petitverse.hosiken.jp/community/petitcom/topic/?read=881&ukey=0
アバター
あんちもん 2019/4/27 12:40 ◆8qCJSJ1bKTIQ
すごく細かい話だと思いましたが、実際に問題が起こり得るんですね。気をつけます!

コメントを書く

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

- WEB PATIO -