【GDevelop】壁ジャンプ(壁キック)と壁張り付きの作り方

GDevelop のプラットフォームキャラクタービヘイビアはとても便利ですが、壁への張り付きや壁ジャンプには対応していません。(端っこを掴むというニッチな機能はあるのにねw)

そこで、壁への張り付きや壁ジャンプもできるようにする方法を紹介します。

ちなみに、ゼロから作る様子の動画もあります。
英語モードですが、作り方の参考にしてください。

このページではゼロから解説すると、めんどくさ……長くなるので、要点のみ解説していきます。

操作するキャラクターの設定

まず、操作対象のキャラクター(スプライトオブジェクト)に、プラットフォームキャラクタービヘイビアを追加します。

その時、「デフォルトコントロール」は OFF にしましょう。
これは壁ジャンプをした時に、一時的に操作不能にするためです。

次に、オブジェクト変数「WallJumpDirection」を追加します。

この変数には、壁ジャンプする方向が入ります。
0 は壁ジャンプをしていない状態、1 は右方向へ壁ジャンプ中、-1 は左方向へ壁ジャンプ中、を表します。
初期値は 0 です。

あと、ポイントの追加も必要ですが、それについては後記します。

壁の設定

てきとーにプラットフォームビヘイビアを追加したオブジェクトを用意しましょう。
特筆すべき点はありません。

イベントを作成する

大きく分けて、以下の 3 つのイベントを作ります。

  • Player のカスタムコントロール
  • 1. 壁とは逆方向へジャンプ
  • 2. 壁に張り付く
以下で、それぞれについて解説します。

Player のカスタムコントロール

ここで、オブジェクト変数「WallJumpDirection」が 0 の時のみ、基本的な動作ができるようにしています。

逆に言うと「WallJumpDirection」が 0 以外の時、つまり壁ジャンプ中は操作ができないようになります。

壁とは逆方向へジャンプ

このイベントは、壁ジャンプした瞬間から上昇中は、コントローラ(キーボード)の入力に関係なく壁の反対側へジャンプし、頂点を越えてから左右の操作ができるようになる、という、よく見る壁ジャンプの挙動を実行するためのものです。

「WallJumpDirection」が 1 の時は右へ、「WallJumpDirection」が -1 の時は左へ、強制的に移動するようにしています。

なお、ジャンプの処理そのものはビヘイビア任せです。

その強制移動は、落下し始めた時(壁ジャンプの頂点を越えた時)か着地した時に、終了するようにします。

なお、注意すべき点として「壁ジャンプ終了」の条件は、壁ジャンプした瞬間(同じフレーム)では真(True)です。
そのため、このイベントは壁ジャンプを開始するイベント(壁に張り付くイベントの中にあります)よりも前に実行する必要があります。
もし、壁ジャンプを開始するイベントよりも後に置いてしまうと、ジャンプした瞬間即座に壁ジャンプ終了が実行されてしまいます。

わざわざイベントグループに 1. とか 2. とか番号を振っているのは、順番を間違えないようにするためです😉

壁に張り付く

壁に接触している間は、最大落下速度を落とすことで、壁に張り付く動作を再現しています。

また、壁に張り付いたら再ジャンプを許可し、壁ジャンプができるようにしています。

さらに、Space キーが押された時は、左右どちらのキーが押されていたかによって、オブジェクト変数「WallJumpDirection」の値を書き換えています。
このイベントにより、次のフレームから壁ジャンプの強制移動が開始されるという仕組みです。

壁との接触判定について

さて、壁と接触しているかの判定に、「衝突」条件ではなく「ポイントはオブジェクト内部にある」条件を使用していることに、疑問を持つ方もいるかも知れません。

これは動画の後半(YouTube)を見てもらえば分かると思いますが、「衝突」条件では、背中が壁と接触していても、壁ジャンプの条件を満たしてしまい、その状態からジャンプすれば真上に壁を登れてしまうというバグに対応するためです。

そこで、下の画像のように「Grab」ポイントを設定し、そのポイントが壁の内部にあるかを判定することで、壁に正面から接触しているか、を判定するようにしています。

ちょっと変わった方法なので、もしかしたら広いくて壁が多いステージでは負荷が増えてしまうとかの問題があるかもしれません😅分かんないけどw

おしまい

コメント

このブログの人気の投稿

GDevelop Wiki がリニューアル!

GDevelop の「イベント」を正しく理解しよう

GDevelop 5.0.138 がリリースされました。