動く床

課題

2Dプラットフォーマーゲームには動く床が必要です。

解決策

この問題には複数のアプローチ方法があります。ここではプラットフォーム部分に AnimatableBody2D を使用し、Tween で移動させる手法を採用します。これにより、多様な動作パターンを実現しながら、必要なコード量を最小限に抑えることができます。

情報

この移動プラットフォームの実装方法は、Tweenではなく AnimationPlayer を使用することでもできます。基本的なセットアップ手順は同様ですが、代わりにTweenコードの代わりにボディの position プロパティをアニメーション化します。

セットアップ方法

まずはプラットフォームキャラクターレシピを使用して、基本的なプラットフォーマーのセットアップから始めてください。このレシピで定義されている基本移動機能は、指定されたプラットフォームと問題なく連携します。もしレシピをカスタマイズしていたり、独自の実装を使用している場合でも、動作原理は同じですのでご安心ください。

プラットフォームの作成

プラットフォームシーンには以下のノードが含まれています。

  • Node2D (“MovingPlatform”):この Node2D の親ノードは、プラットフォームの「アンカー」または開始点として機能します。アニメーションでは、この親ノードを基準としてプラットフォームの 座標 を制御します。
    • AnimatableBody2D:これは実際に移動するプラットフォーム本体を表します。このノードが移動対象となります。
      • Sprite2D:ここではスプライトシート、個別の画像、あるいは ノードとしてタイルマップを使用することもできます。
      • CollisionShape2D:ヒットボックスの大きさが大きすぎると、プレイヤーがプラットフォームの端から「浮いて」見える原因になるので注意してください。

Sprite2Dテクスチャと衝突形状を適切に設定してください。AnimatableBody2Dでは、Sync to Physics(物理演算と同期) プロパティを「オン」に設定します。コードでボディを動かしているため、これにより物理演算ステップ時に正しく移動され、プレイヤーや他の物理オブジェクトと連動した動きを維持できます。

次にルートノードのNode2Dにスクリプトを追加してください。

extends Node2D

@export var offset = Vector2(0, -320)
@export var duration = 5.0

func _ready():
    start_tween()

func start_tween():
    var tween = get_tree().create_tween().set_process_mode(Tween.TWEEN_PROCESS_PHYSICS)
    tween.set_loops().set_parallel(false)
    tween.tween_property($AnimatableBody2d, "position", offset, duration / 2)
    tween.tween_property($AnimatableBody2d, "position", Vector2.ZERO, duration / 2)

以下の機能をスムーズに動作させるために、Twien のオプションを活用しています。

  • set_process_mode():物理演算処理段階でのみ移動が行われるようにします。
  • set_loops():Tween再生を繰り返す設定です。
  • set_parallel(false):デフォルトでは、すべての tween_property() 変更が同時に実行されます。これを無効にすると、2つの動作が順次行われます。オフセットの一方端に移動した後、開始位置に戻るという流れになります。

翻訳された2つのプロパティを使用することで、プラットフォームの移動を調整できます。offsetを設定してTweenが開始点から相対的に移動する位置を指定し、durationを設定してサイクルを完了するまでの時間を決定します。

自分のレベル/ワールドにプラットフォームを追加し、実際に試してみてください。

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

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

関連レシピ

近日公開予定

–>