今回は、数日前にあほげー第42回にエントリーした、無料で軽快な 2D / 3D ゲームエンジン「 Godot Engine 4 」で作成したミニゲーム「川沿いホテルゴルフ」の中で用いた、パワーゲージの量に応じて物を右方向に飛ばすための物理関数を使った処理を紹介します。
#GodotEngine を勉強し始めて1カ月程度なので、もっと、適切な方法がある可能性が高いです。




※ Godot Engine v4.1.2 (.NET 版ではありません) を使用しています。
関連記事
パワーゲージの実装については、以下の記事をご覧ください。
apply_impulse 関数について
RigidBody2D の apply_impulse 関数を使って、瞬間的に力を加えて、物体をゴルフクラブで飛ばす挙動を作りました。
他にも継続的に力を加える apply_force や、回転させる apply_torque_force, apply_torque_impulse もあるので、力の加え方によって使い分けましょう。
void apply_impulse ( Vector2 impulse, Vector2 position=Vector2(0, 0) )
Applies a positioned impulse to the body.
位置決めされたインパルスをボディに適用します。An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the “_force” functions otherwise).
衝動は時間に依存しません。フレームごとにインパルスを適用すると、フレームレートに依存した力が発生します。このため、これは 1 回限りの衝撃をシミュレートする場合にのみ使用してください (それ以外の場合は、「_force」関数を使用してください)。RigidBody2D — Godot Engine (4.x)の日本語のドキュメント
position
is the offset from the body origin in global coordinates.
位置は、グローバル座標における体の原点からのオフセットです。
apply_impulse 関数の用例
今回の例では、ホテルの画像を表示している Hotel シーンが自ら瞬間的に力を加えて飛ぶようにするために、 Hotel シーンのルートノードに RigidBody2D クラスを継承させました。
他に下位のノードで当たり判定を行う CollisionShape2D も追加しています。

ゴルフクラブでホテルを飛ばすイベント関数を作成して、その中で $Hotel ノードの apply_impulse 関数で自身の少し左下の部分に対して、右上に力を加えます。
func OnShot():
print("OnShot")
$Shacho.OnShot()
var power = Vector2(15000, -15000) * $Shacho.power_of_shot
$Hotel.apply_impulse(Vector2(-30, 100), power)
hotel_flying = true;
shot_count += 1
$HUD.show_shot_count(shot_count)
力は power 変数で前の行で計算している通り、最大値が (15,000, -15,000) の左上方向で、それに対してパワーゲージの現在の比率をかけています。
パワーゲージが最大の 1.0 ならば最大の力、 0.1 ならば 1 割りの力を加えます。

テスト
マウス左ボタンを離してパワーゲージが確定すると、さきほどの OnShot 関数が呼び出されて、ゴルフスイングのアニメーションに合わせて、apply_impulse 関数で瞬間的にホテルの左下の一点に、右上への力が加わり、ホテルが右上に飛びました。
まとめ
今回は、数日前にあほげー第42回にエントリーした、無料で軽快な 2D / 3D ゲームエンジン「 Godot Engine 4 」で作成したミニゲーム「川沿いホテルゴルフ」の中で用いた、パワーゲージの量に応じて物を右方向に飛ばすための物理関数を使った処理を紹介しました。
RigidBody2D クラスの apply_impulse 関数では、力を加える位置を指定して、瞬間的に力を加えられることが分かりました。
他にも継続的に力を加えたり、回転力を与える関数があることもわかりました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- RigidBody2D — Godot Engine (4.x)の日本語のドキュメント
- あほげー | TOPページ
- Draw Freely | Inkscape
記事一覧 → Compota-Soft-Press
コメント