1 节点管理技巧

太多树节点放在world节点下了,新建一个node2d类型的Trees节点,所有的树节点都做它的子节点,记得调整ysort属性

2 创建草场景

创建草节点,调整offset使其处在原点位置,多铺设几格“草”

image-20240603175250792

3 创建草特效

新建node2D节点GrassEffect,使用子节点AnimatedSprite2D制作简单动画,取消勾选居中

image-20240603175640728

4 草的脚本

按下攻击让当前节点消失

1
2
3
4
5
6
7
extends Node2D

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if Input.is_action_just_pressed("attack"):
queue_free()

5 草特效的脚本

播放摧毁特效

1
2
3
4
5
6
7
8
extends Node2D

@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
animated_sprite_2d.play("Animate")

6 使用信号控制特效播放

通过信号连接,让动画播放完之后消失

image-20240603192504465

更新草特效的脚本

1
2
3
4
5
6
7
8
9
10
11
12
extends Node2D

@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D

# Called when the node enters the scene tree for the first time.
func _ready() -> void:
animated_sprite_2d.play("Animate")


func _on_animated_sprite_2d_animation_finished() -> void:
queue_free()

7 在代码中实例化摧毁特效

grass.gd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extends Node2D

func _process(delta: float) -> void:
if Input.is_action_just_pressed("attack"):

#引用摧毁特效
const GRASS_EFFECT = preload("res://Effects/grass_effect.tscn")
#实例化
var grassEffect = GRASS_EFFECT.instantiate()

#用代码实例化它,要求它必须挂载到一个节点下,是一个节点的子节点,这里是world节点的子节点
var world = get_tree().current_scene
world.add_child(grassEffect)

#摧毁特效的全局位置等于草的当前位置
grassEffect.global_position = global_position
queue_free()