8方向移動・アニメーション

課題

2Dキャラクターが必要です。アニメーションを含む8方向移動が可能なものが求められます。

解決策

この例では、Isometric: Mini-Crusaderを使用します。これには待機、歩行、攻撃など8方向に対応したアニメーションが含まれています。

alt alt

アニメーションはフォルダ単位で整理されており、各フレームごとに個別の画像が用意されています。ここではAnimatedSprite2Dを使用し、各アニメーションにはその動作方向に基づいて名前を付けます。例えば、右向きで時計回りに移動するidle0から、同じく時計回りに動くidle7までといった具合です。

キャラクターが移動する際には、動きの方向に基づいて適切なアニメーションを選択します。

alt alt

マウスを使って移動します。キャラクターは常にマウスの方向を向き、マウスボタンをクリックするとその方向に走り出します。

どのアニメーションを再生するか選択するためには、マウスの方向を取得し、それを同じ範囲(0-7)にマッピングする必要があります。get_local_mouse_position()を使用することで、キャラクターに対するマウスカーソルの位置を取得できます。次にsnappedf()関数を使用して、マウスベクトルの角度を最も近い45度間隔(PI/4ラジアン)にスナップさせると、以下の結果が得られます。

alt alt

各値を 45°(PI/4 ラジアン)で除算すると、以下のようになります。

alt alt

最終的には、wrapi()関数を使用して結果の範囲を0-7にマッピングする必要があります。これにより、正しい値が得られます。この値をアニメーション名の末尾に追加します(“idle”、“run"など)。こうすることで、正しく動作するアニメーションが完成します。

func _physics_process(delta):
    current_animation = "idle"

    var mouse = get_local_mouse_position()
    angle = snappedf(mouse.angle(), PI/4) / (PI/4)
    angle = wrapi(int(angle), 0, 8)

    if Input.is_action_pressed("left_mouse") and mouse.length() > 10:
        current_animation = "run"
        velocity = mouse.normalized() * speed
        move_and_slide()
    $AnimatedSprite2D.animation = current_animation + str(a)

動作テストを行ったところ、以下の現象が確認されました:

alt alt

キーボード入力

マウスの代わりにキーボード操作を使用している場合、押されているキーに基づいて移動角度を取得できます。それ以外の手順は同様の方法で進行します。

func _process(delta):
    current_animation = "idle"
    var input_dir = Input.get_vector("left", "right", "up", "down")
    if input_dir.length() != 0:
        angle = input_dir.angle() / (PI/4)
        angle = wrapi(int(a), 0, 8)
        current_animation = "run"
    velocity = input_dir * speed
    move_and_slide()
    $AnimatedSprite2D.play(current_animation + str(angle))

プロジェクトのダウンロード

プロジェクトコードはこちらからダウンロードできます。https://github.com/godotrecipes/8_direction_animation