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

アバター
ナカジマ ◆DSpvksQCyRZC
2018/11/24 18:37
質問
マップについて
スプライトが移動中に「BG1」に当たったら十字キーを押している方向と反対の方向にx、yを動かして相殺し、何とか壁に当たったように見せたかったのですがどうも上手く行きません。すり抜けたり、壁に触れたまま動けなくなったり、壁にそって歩けなかったりと色々問題が発生しているので、アドバイスをお願いします。

コメント

アバター
あんちもん 2018/11/24 18:48 ◆8qCJSJ1bKTIQ
マップとの当たり判定難しいですよね
自分はXやYの移動量を相殺するのではなくFLOORを使ってBGとの当たり判定がBGに接触しないギリギリの位置に補正されるようにしています。
アバター
あんちもん 2018/11/24 18:53 ◆8qCJSJ1bKTIQ
自分も最近ようやく覚えたところなので不備な点もあるかと思いますが、BGとの当たり判定のテストに組んだプログラムを公開しておきます。
【YK2NQXNP】
42行目が地面、44、45行目が左右の壁との当たり判定の処理になります。
アバター
ナカジマ 2018/11/24 18:56 ◆DSpvksQCyRZC
あんちもんさん
floor 整数部取り出すアレですよね。
んー、小数が発生しそうな部分が見つからず……具体的にどんな使い方をするのでしょうか?理解力が低くて申し訳ありません💧

追記
書いてる途中でコメント頂いてました!ありがとうございますm(_ _)m!
アバター
あんちもん 2018/11/24 19:20 ◆8qCJSJ1bKTIQ
X=FLOOR(X/16)×16とすると、Xが16の倍数に補正されます。(Xが16の倍数でないとき、FLOORによってX/16は0、1、2…といった整数になり、最後に16を掛ける)
マップチップの大きさは16×16のドットなので、マップに触れた時この処理を行うとマップチップちょうど一個分となりの位置に座標が移動するようになっています。
35行目に
IF YMOV>15 THEN YMOV=15
とありますが、これは落下するときのスピードの上限を設定しており、地面との当たり判定が16ドット以上の間隔を空けて移動しないようにしています。16ドット以上の間隔が空いてしまうと、16×16ドットの大きさのマップチップと接触しなくなる(すり抜ける)恐れがあるからです。
ついでに、42行目の処理と44、45行目の処理の順番を入れ替えると挙動が全く変わることが分かると思います。
座標の補正をする際は、プログラムを書く順番が案外バグの原因になっている時があるので、手詰まったら順番を入れ替えてみるのも大切だと思います。
長文失礼しました!
アバター
ナカジマ 2018/11/24 19:52 ◆DSpvksQCyRZC
おおお。とても詳しい説明ありがとうございます!
書く順番は今まであまり意識していなかったので、どっかにミスがあるかもしれません。確認してみますね。
アバター
あきと 2018/11/24 20:48 ◆qGd5dQw2g3a2
ダウンロードして書き換えたりしてるのですが、このゲームはBGがスクロールすることはないのですか?
16ドットで補正される処理に限定されてますがBGがスクロールすると16ドットの倍数で無くなってしまうため今の処理だと問題が起きるかもしれないです。

一つだけ修正箇所を指摘させてもらうと足下の判定を行うBGGET命令のところがBGGET(…Y+15)BGGET(…,Y+14)となってますがキャラの足下ということであれば両方Y+16かなと思いました
アバター
あんちもん 2018/11/24 21:25 ◆8qCJSJ1bKTIQ
あきとさん
修正ありがとうございます!
BGGET(…,Y+14)はY+15の打ち間違いでした。
Y+15にしているのは16×16のキャラの丁度四隅に判定を置こうとしたからですね。
確かに16ドット単位の補正だけだとマップがジワジワ動く強制スクロールとか坂道の処理とかに対応が効かなそうですねー。
マップの座標に合わせて16nから16n+15までの単位に補正するドット数を変化させるとか、坂道は別個に処理を作るとかになってくるでしょうか。
プレイヤーキャラを画面中央に固定してBGを上下左右にスクロールさせて移動を表現したり、マップ端でキャラを直接移動させたりするのは16ドット単位の補正で自分は事足りたのですが、それ以外の条件となるとまだ手を出せていないので何とも言えないです。
あ、強制スクロールならBGCOORDでプレイヤーとマップBGの座標変化を同期させるとかが行けそうかもですね。
アバター
キルル2 2018/11/24 23:21 ◆rGE712Ruejv7
BGが動かない前提のサンプルコードだよ
【VR3YX3L4】
BGスクロールに対応するなら、プレイヤーが動いてない時でも判定し続ける必要があるよ


あとね、プログラムにはインデントつけた方がいいよ
インデントっていうのはザックリ言うと空白のことだよ
アバター
キルル2 2018/11/24 23:25 ◆rGE712Ruejv7
間違え
BGが独立してスクロールするときに、プレイヤー監視の必要が生じます
画面全体がスクロールすると考えれば、16の倍数のままでもいけます

基本的には、プレイヤーが動いてなければBGとの当たり判定を取る必要はありません
画面全体がスクロールする場合でも、プレイヤーが動かない限りBGと当たる可能性はありません
でも、BGだけがスクロールする場合、プレイヤーが動かなくても、BGと当たる可能性が出てくるので、その意味でプレイヤーを監視する必要があるのです
プチコンでは画面全体スクロールの処理を簡単に実現する方法もあります
私個人の経験上、今はスクロールのことは置いといて、当たり判定のことだけを考えるほうが得策かと思います
アバター
ナカジマ 2018/11/25 0:59 ◆DSpvksQCyRZC
キルル2さん

ああありがとうございます!!
ダウンロードしてみましたが、まさしく私が抱えてる課題の答えでした。解析してきます!
アバター
キルル2 2018/11/25 21:32 ◆rGE712Ruejv7
頑張って

コメントを書く

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

- WEB PATIO -