godot4制作2D游戏06———添加攻击功能
创建新文件夹
- 创建一个GeneralNodes文件夹来放置通用文件
- 在下面创建一个HitBox(被伤害的节点)
- 创建一个Area2D类型的场景
- 取消Monitoring选项,不会主动检测碰撞
- 保留Monitorable选项,表示可以被检测
- Collision选择第九层
- 创建一个hit_box的脚本
1
2
3
4
5
6
7
8
9
10
11
12
13class_name HitBox extends Area2D
signal Damaged( damage: int)
func _ready() -> void:
pass
func _process(delta: float) -> void:
pass
func TakeDamage( damage: int) -> void:
print("take damage", damage)
Damaged.emit(damage) - 创建一个信号,在收到伤害的时候发送信号,让监听的节点处理
- 创建一个HurtBox(伤害节点)
- 创建一个Area2D类型的场景
- 保留Monitoring选项,主动检测碰撞
- 取消Monitorable选项,不被检测碰撞
- Collision Mask 第二层,表示和第二层的物体进行碰撞
- 创建一个hurt_box脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class_name HurtBox extends Area2D
func _ready() -> void:
area_entered.connect( AreaEntered )
pass
func _process(delta: float) -> void:
pass
func AreaEntered( a : Area2D) -> void:
if a is HitBox:
a.TakeDamage(damage)
pass
- 创建一个植物场景
引入一个HitBox,表示这是一个可以被伤害的部分
加入一个staticBody
将其Layer设置为5,表示和第五层有交互的可以触碰
添加plant脚本
1
2
3
4
5
6
7
8
9
10
11
12class_name Plant extends Node
func _ready() -> void:
$HitBox.Damaged.connect(TakeDamage)
pass
func _process(delta: float) -> void:
pass
func TakeDamage(damage: int) -> void:
queue_free()
pass监听HitBox的通知
player和playground的y sort enable要打开
- Player添加一个Node2D类型的名称为Interaction的节点
在这下面添加HurtBox,选择一个图形,表示可以造成伤害
在状态机Attack下添加代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16func Enter() -> void:
player.UpdateAnimation("attack")
attack_animation_player.play("attack_" + player.AnimationDirection())
animation_player.animation_finished.connect( EndAttack )
audio.stream = audio_stream
audio.pitch_scale = randf_range(0.9, 1.1)
audio.play()
attacking = true
await get_tree().create_timer(0.075).timeout
hurt_box.monitoring = true
pass
func Exit() -> void:
animation_player.animation_finished.disconnect( EndAttack )
hurt_box.monitoring = false
pass为Interaction节点添加脚本PlayerInteractionHost
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class_name PlayerInteractionHost extends Node2D
@onready var player: Player = $".."
func _ready() -> void:
player.DirectionChanged.connect(DirectionChanged)
pass
func DirectionChanged(direction: Vector2) -> void:
match direction:
Vector2.DOWN:
rotation_degrees = 0
Vector2.UP:
rotation_degrees= 180
Vector2.LEFT:
rotation_degrees = 90
Vector2.RIGHT:
rotation_degrees = -90
_:
rotation_degrees = 0
pass同时修改Player脚本,新增信号,在收到DirectionChanged信号时修改hurtBox的方向
- 在下面创建一个HitBox(被伤害的节点)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Have a nice day!!