【GDevelop 基礎 06】キーを押すと移動する ~斜め移動の速度の修正~

今回作成するもの

前回の記事 【GDevelop 基礎 05】キーを押すと移動する - Make Everything Games では、斜め移動時の速度が X, Y 方向への移動速度よりも速いという課題が実はありました。

これはよくある問題で X, Y 方向のそれぞれの成分に働く速度が、X+Y 方向には  \sqrt{2} 倍された値になるというものです。(前回の場合は 1 フレームで X, Y 方向に同じ Speed の速度が適用されるため)

上記の動きでは花の付いたキャラクターが前回のスクリプトを適用したもの、そうではないキャラクターが今回のスクリプトを適用したものです。

横移動の速さは同じなのに、斜め移動が明らかに異なることが分かると思います。

OnKeyPress_Move_Fixed Behavior を作成

以下のように OnKeyPress_Move_Fixed の Behavior を追加します。doStepPreEvents を追加します。

パラメータの追加

【GDevelop 基礎 05】キーを押すと移動する - Make Everything Games と同じです。

doStepPreEvents の実装

【GDevelop 基礎 05】キーを押すと移動する - Make Everything Games と異なっているのは、最後の「スプライトの移動」部分だけです。以下の 2 パターンで動作が変わっています。

  • X, Y どちらかのみの移動
    • つまり、X, Y のどちらかの成分が 0 での移動です
    • 両方 0 でもこちらに入りますが、そもそも移動はしません
  • X, Y 両方の移動
    • つまり、X, Y のどちらの成分も 0 以外の値が入った移動です
    • 要は斜めの移動が行われているということです

上記の条件の記述はもっとスマートな記述方法がありそうな気がするのですが、とりあえずこのようにしています。(乗算ができれば vx * vy0 かどうかでも判定ができると思います)

今回注目すべきは後者の 「X, Y 両方の移動」つまりは斜め移動です。

上述の通り、X, Y で同じ速度が与えられる場合においては、斜めは  \sqrt{2} 倍になるので、逆に  \sqrt{2} で割ってしまえばよいです。

今回は X, Y 方向の速度は  v_x = v_y であり、それを  v_p とした場合、 \sqrt{2} で割った値でピタゴラスの定理にあてはめると以下のようになります。(  v が斜めの速度)

  {v}^2 = {(\frac{v_x}{\sqrt{2}})}^2 + {(\frac{v_y}{\sqrt{2}})}^2 = \frac{{v_x}^2}{2} + \frac{{v_y}^2}{2} = \frac{{v_p}^2}{2} + \frac{{v_p}^2}{2} = {v_p}^2 \\
v = v_p

これで、  \sqrt{2} で割った時に、斜めの速度と X, Y のそれぞれの速度が等しくなることが分かります。

スプライトの Behavior に設定する

動作確認

冒頭で説明した通りです。斜め移動の速度アップが解消され、縦・横移動と同じ速度で移動できるようになりました。

Unity だと、ベクトルの normalized で対応したりしますが、GDevelop はベクトルでの速度の指定は標準の 2D の機能ではなさそうなので、今回はこのように計算しました。

もし、X, Y での速度が異なる場合には  \sqrt{2} で固定せず、計算した上で上限値を決める方法が考えられますね。