今回作成するもの
前回の記事 【GDevelop 基礎 05】キーを押すと移動する - Make Everything Games では、斜め移動時の速度が X, Y 方向への移動速度よりも速いという課題が実はありました。
これはよくある問題で X, Y 方向のそれぞれの成分に働く速度が、X+Y 方向には 倍された値になるというものです。(前回の場合は 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 両方の移動
- つまり、X, Y のどちらの成分も
0
以外の値が入った移動です - 要は斜めの移動が行われているということです
- つまり、X, Y のどちらの成分も
上記の条件の記述はもっとスマートな記述方法がありそうな気がするのですが、とりあえずこのようにしています。(乗算ができれば vx * vy
が 0
かどうかでも判定ができると思います)
今回注目すべきは後者の 「X, Y 両方の移動」つまりは斜め移動です。
上述の通り、X, Y で同じ速度が与えられる場合においては、斜めは 倍になるので、逆に で割ってしまえばよいです。
今回は X, Y 方向の速度は であり、それを とした場合、 で割った値でピタゴラスの定理にあてはめると以下のようになります。( が斜めの速度)
これで、 で割った時に、斜めの速度と X, Y のそれぞれの速度が等しくなることが分かります。
スプライトの Behavior に設定する
動作確認
冒頭で説明した通りです。斜め移動の速度アップが解消され、縦・横移動と同じ速度で移動できるようになりました。
Unity だと、ベクトルの normalized で対応したりしますが、GDevelop はベクトルでの速度の指定は標準の 2D の機能ではなさそうなので、今回はこのように計算しました。
もし、X, Y での速度が異なる場合には で固定せず、計算した上で上限値を決める方法が考えられますね。