Menu
CoddyTech

岩を分裂させる

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 は、その処理をフレームの最後に実行するため、安全です。

今のところ、すべての岩が分裂するため、岩はなくなりません。次はサイズを扱います。

challenge icon

チャレンジ

難しい

撃たれた岩が2つに分裂するようにします。

  1. rock.gdで、signal broken(rock)を追加し、弾が当たったときにqueue_free()の前にbroken.emit(self)を呼び出します。
  2. main.gdで、spawn_rock内で各岩のbrokenを_on_rock_brokenに接続します。
  3. _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プレイグラウンド