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

アバター
未熟マン ◆hU1OcdQEWi0y
2019/6/6 12:38
協力
当たり判定前でストップさせたい
テクニック的な質問ですいません。
スプライトの当たり判定を使い、「壁に当たったら止まる」処理での困っています。
移動側キャラの座標を「1ずつ」加算してズラして当たり判定をした場合は、当たり判定が出た時に1戻せばピタリと止まれるのですが、「可変速度(1.1〜5.0みたいな)ずつ」移動させた場合には、当たり判定が出た時には既に壁の中で、加算前に戻すと壁より前、となってしまい上手くいきません。
何かこういう時のテクニックご存知の方いらっしゃいませんでしょうか?
VSYNCを外し1未満ずつ加算にすると当たり判定的には上手くいくのですが、かわりに実行ループ速度が極端に速すぎて、ウエイト処理がかなり大変です。
VSYNCのまま、当たり判定が出た時に、少し戻り処理→再表示→当たり判定が消えるまでループ、など試してみたのですが、意外とスローで、戻る瞬間がハッキリ見えてしまいイマイチです。
ご経験者の方、どうかお知恵をお貸し頂けましたら!

コメント

アバター
未熟マン 2019/6/6 13:49 ◆hU1OcdQEWi0y
こういちさんありがとうございます!

当たる直前に戻るのは簡単だったのですが、例えばですが、4ドット加算する処理をしていた最中に、3ドット向こうに壁があった場合、4ドット戻すと壁まで常に3ドット空いてしまうと思うのです。

でも「SPHITRCやSPHITVECを活用して」というのは、まさにこれだったかもしれません。
これって何の為にある命令なのか、リファレンスには「移動量x,y」項目はあるけどそれには触れられていなかったり、よく分かっていませんでしたが、こういう時に使えそうですね!
試してみます。
アバター
未熟マン 2019/6/6 14:37 ◆hU1OcdQEWi0y
ありがとうございました!
早速試してみたところ、これならうまくいきそうです!
SPHITSPだとどうしても「重なった(当たった)後」の戻り処理になり一瞬のタイムラグが見えてしまいましたが、SPHITRCなら座標加算直後(表示前)に判定ができ、とても都合が良かったです。
まだ移動量x,yという項目が何なのかは試していませんが、とりあえず現状でも動いてます。
大変感謝します。助かりました。ありがとうございました!


他に何か当たり判定でテクニックありましたら、後学の為にどうぞお願い致します。
アバター
あきと 2019/6/6 14:44 ◆qGd5dQw2g3a2
最初に想定の移動速度で当たり判定を取ってみて当たりが無かったらそのまま反映させる。
壁の中判定されたら、元の場所から1ドットずつズラしながら壁との判定を行って埋まる判定された一つ手前の場所が壁ギリギリという事になります。
これだと壁が近くに無いときは判定は一回で済みます。
アバター
未熟マン 2019/6/6 14:55 ◆hU1OcdQEWi0y
あきとさんありがとうございます!
まさにそれでした。
判定が出た時には、元の位置に戻すのではなくて、ハンパな空白分だけは移動させないといけませんね。
最初テストではそれ忘れていました。
(壁で止まりはしましたが、壁より少し前で止まってしまいました)

せいぜい最大5ドットの移動量なので、じゃあ何ドット先が壁なのかの判定も楽そうです。
ありがとうございました。
アバター
ツララ 2019/6/6 16:44 ◆ArUdBYOYME1V
対象が壁なら判定は不等式でやれば一回で済むんじゃないんです?
めり込んだ部分だけ座標の差をとって戻す処理まで見えてるあたり
なんか最初から答え分かってたみたいな感じですね。
アバター
ほしけん 2019/6/6 19:48 ◆BJ4kbE35MkgI
答えを分かってて質問してるとはちょっと邪推が過ぎるのでは。
いいところまで行ってるけど、あとちょっとで詰んでるなんてこと
プログラミングしていたらよくあることなんじゃないですか?
アバター
あきと 2019/6/6 22:11 ◆qGd5dQw2g3a2
以前ジャンプゲームの質問をした人のために作ったソースをアップロードしました。
プチコン3号用です。主さんは4号ですかね?そうであれば上げ直します。
公開キー【上げ直しました】
ファイル名「JUMPTEST」

あとツララさんには後学のために不等式を使って判定回数を少なくする方式を記述して上げてもらいたいです。
上で説明した方式を私はこのソースの中のBGGANTEI1DOT_Yという関数で行っているので一回の判定に書き換えてもらえると勉強になります。
アバター
未熟マン 2019/6/6 23:27 ◆hU1OcdQEWi0y
あきとさん重ねてありがとうございます。
自分は4号です。

お手数おかけしますが、よろしければ是非是非拝見させて下さい、
アバター
あきと 2019/6/6 23:54 ◆qGd5dQw2g3a2
3号用のプログラムとしてもファイルが一つ必要だったので上げ直しました。4号用の変更はもう少しかかります。
3号用公開キー【C3KK439Y】
プロジェクト名「_JUMPTEST」
アバター
あきと 2019/6/7 1:11 ◆qGd5dQw2g3a2
プチコン4号で動くものも用意しました。
公開キー【4E3EK45PY】
プロジェクト名「_JUMPTEST」
MAIN.PRGで保存し直したのでそのまま実行できるはずです。Aでジャンプ、Bで剣を振ります。
いやー、互換性を保つために色々関数で逃げているのであまり参考にならないですね。
TOFSの移動方向が逆になっているのと、CHRCHKがドット単位で取れないところで手こずってしまいました。
アバター
未熟マン 2019/6/7 3:04 ◆hU1OcdQEWi0y
あきとさん、ありがとうございます!
いやサンプルとは言いながら操作するだけで面白く、まさかの多重スクロール!が綺麗で、しばらく夢中になって遊んでしまいました。
プログラム内を拝見してさらに、整いまくった綺麗な文体に恐れ入りました。
私も結構これに似た物を作っているところですが、私の方はプログラム内は相当滅茶苦茶でとても比較になりません…!
とりわけ、さりげなくこの一部画面内移動それ以上はスクロールというテクニックや、当たり判定部分の関数での集約具合に舌を巻きました。しかもこれだけ注釈や改行を入れてくれて200行程度、省けば100行ほどで収まろうかというコンパクトさとは…。

この合理的なプログラミングはどこで身につけられたのですか。関数などはいきなりこんなに纏められるのですか?最後に集約されるのですか?
まだ全然解析などできていないですが、おそらくドットの色情報?で当たり判定を見ていらっしゃる様ですが、これもやはり加速度が有って、おそらく1ドットずつの自機移動ではないと思うのですが、当たり判定には前述の、「次に判定が出る場合に1ドットずつ加速度内をチェックする方法」を使われているのですか?コンパクトに集約され過ぎていてとても一見では分かりそうもありません。

ともかく公開して下さって本当にありがとうございました。参考にして勉強します。
しかしこれは続きがやりたくなりますね。いつかゲーム化期待しております。
アバター
あきと 2019/6/7 12:37 ◆qGd5dQw2g3a2
多重スクロールは簡単です。
違うBG面に展開したあとメインのBGの移動量の0.9倍で背景をスクロールさせてるだけです。

この後関数はまとめ直すのか?という質問に関しては、このソースはこれ以上作らないと思うのでこのままですが、本腰を入れて作るときはプチコン4の命令で書き直します。あくまでプチコン3号のソースが動くようにバイパスしたという印象です。

当たり判定はこのスレに書き込んだ方法です。
CHKCHRで移動後座標のBGのアトリビュートを取って壁の中だったら元の位置から1ドットずつずらして当たり判定を取り直してギリギリの場所を探るというものです。
アバター
あきと 2019/6/7 15:22 ◆qGd5dQw2g3a2
最初から関数化してることは少ないです。
メインループの中にある程度処理を書いて、やりたい事ができたとか長くなってきたなーと思ったところで分離したりすることが多いですね。
たとえばBG表示しようと思って初期設定する処理と読み込み処理書いてたら一画面越えてしまったぐらいの所でBG_INITとかに分けるというような流れが多いです。
あ、パラメーター渡しすると色々なところで使えそうだなと最初から見通しかついてる処理は関数化しますね。

何か参考になれば幸いです。

コメントを書く

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

- WEB PATIO -