await get_tree().create_timer(3).timeout
queue_free()
等待三秒后,
對(duì)自身及其節(jié)點(diǎn)樹下子進(jìn)行銷毀 / 摧毀節(jié)點(diǎn)
@export var bullet_scene : PackedScene
獲取bullet場(chǎng)景,需要在檢查器里賦予快速加載Bullet場(chǎng)景 / 生成PackedScene場(chǎng)景
@export var animator : AnimatedSprite2D
獲取動(dòng)畫,同樣需要在檢查器里賦予同場(chǎng)景下的AnimatedSprite
if not is_game_over:
# print(Input.get_vector("left","right","up","down") * move_speed)
velocity = Input.get_vector("left","right","up","down") * move_speed
if velocity == Vector2.ZERO:
animator.play("idle")
else:
animator.play("run")
判斷移動(dòng)速度來播放動(dòng)畫
func _on_body_entered(body: Node2D) -> void:
if body is CharacterBody2D:
body.game_over()
在怪物代碼里,用信號(hào) 函數(shù)作碰撞判斷,判斷是否與角色碰撞
func _on_area_entered(area: Area2D) -> void:
if area.is_in_group("bullet"):
給bullet建立場(chǎng)景組,同是用信號(hào) 函數(shù)作碰撞判斷,判斷是否與子彈碰撞
func _physics_process(delta: float) -> void:
position += Vector2(bullet_speed, 0) * delta
增加自身的移動(dòng)速度
func _on_fire() -> void:
if velocity != Vector2.ZERO or is_game_over:return
var bullet_node = bullet_scene.instantiate()
bullet_node.position = position + Vector2(14, 7)
get_tree().current_scene.add_child(bullet_node)
角色樹里添加一個(gè)Timer,信號(hào)里添加函數(shù),timeout()
判斷是否移動(dòng)及是否游戲結(jié)束。返回
初始化節(jié)點(diǎn),獲取一個(gè)新bullet,
獲取角色位置+偏移位置,賦予bullet位置
加載當(dāng)前場(chǎng)景,添加子場(chǎng)景/節(jié)點(diǎn)

在主場(chǎng)景添加一個(gè)Timer節(jié)點(diǎn),設(shè)置簡(jiǎn)隔時(shí)間3.0S,自動(dòng)開始啟用。
然后在點(diǎn)節(jié)點(diǎn)信號(hào) 使用timeout()
@export var spawn_timer : Timer
func _on_timer_timeout() -> void:
var slime_node = slime_scene.instantiate()
slime_node.position = Vector2(260, randf_range(50, 115))
get_tree().current_scene.add_child(slime_node)
公開timer變量,在檢查器加載節(jié)點(diǎn)樹下的timer
在timeout函數(shù)里,初始化一個(gè)新的slime,設(shè)置位置,然后添加到場(chǎng)景樹下
Canvas Layer 用來添加界面UI
AudioStreamPlayer
Timer?
timer.start()