Menu
CoddyTech

大小不同的小行星

本课属于 Coddy Godot 学习旅程的“项目”单元。第 19 课,共 36 课。

只有大岩石才应该分裂。给每块岩石设置一个 size,大岩石为 2,小岩石为 1,并在 rock.gd 的 _ready 中根据它来绘制:scale = Vector2.ONE * size * 0.5。

spawn_rock 也需要接收大小。要在 add_child(rock) 之前设置 rock.size:_ready 会在 add_child 内运行,所以之后再设置大小就来不及影响缩放了。

func _on_rock_broken(rock):
	if rock.size == 2:
		spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5, 1)
		spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5, 1)

小岩石只会碎裂。

challenge icon

挑战

困难

让大石块分裂,小石块破碎。

  1. 在 rock.gd 中,添加 var size = 2,并在 _ready 中设置 scale = Vector2.ONE * size * 0.5。
  2. 给 spawn_rock 添加一个 size 参数,并在 add_child 之前设置 rock.size。最初生成的 4 个石块大小为 2。
  3. 仅当 rock.size == 2 时才分裂成两个大小为 1 的石块。

按“开始”并射击:大石块会分裂,小石块会破碎。然后按“检查”。

亲手试试

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
	rock.broken.connect(_on_rock_broken)
	add_child(rock)

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 在线编辑器