岩を分裂させる
CoddyのGodotジャーニー「プロジェクト」セクションの一部。レッスン 18/36。
岩を撃つと、2つに分裂するはずです。岩は signal broken(rock) と broken.emit(self) で、壊れたことを通知します。self は岩なので、リスナーは岩がどこにあり、どのように動いていたかを把握できます。
spawn_rock は、新しい岩それぞれに rock.broken.connect(_on_rock_broken) を接続します。この関数は、互いに離れる向きに進む2つの岩を生成します。
func _on_rock_broken(rock):
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)Godotが接触しているエリアを確認している間に、シグナルが届きます。そのときにエリアを追加すると、Can't change this state while flushing queries というエラーでゲームが停止します。call_deferred は、その処理をフレームの最後に実行するため、安全です。
今のところ、すべての岩が分裂するため、岩はなくなりません。次はサイズを扱います。
チャレンジ
難しい撃たれた岩が2つに分裂するようにします。
rock.gdで、signal broken(rock)を追加し、弾が当たったときにqueue_free()の前にbroken.emit(self)を呼び出します。main.gdで、spawn_rock内で各岩のbrokenを_on_rock_brokenに接続します。_on_rock_broken(rock)内で、call_deferredを使って、示されているように岩を2つ生成します。
「プレイ」を押して岩を撃つと、2つの岩が飛び散ります。その後、「確認」を押します。
自分で試してみよう
extends Node2D
const ROCK = preload("res://rock.tscn")
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))
func spawn_rock(where, velocity):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
add_child(rock)
プロジェクトのすべてのレッスン
自分で練習してみよう: Godotプレイグラウンド