大小不同的小行星
本课属于 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)小岩石只会碎裂。
挑战
困难让大石块分裂,小石块破碎。
- 在
rock.gd中,添加var size = 2,并在_ready中设置scale = Vector2.ONE * size * 0.5。 - 给
spawn_rock添加一个size参数,并在add_child之前设置rock.size。最初生成的 4 个石块大小为2。 - 仅当
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 在线编辑器