godot4制作2D游戏10———创建简单敌人(二)
引入资源
- 将DestroySmoke、hit_00、hit_01这几个资源导入项目
- 添加一个HurtBox,并添加一个CollisionShape2D
- 创建两个新的State
- Stun
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46class_name EnemyStateStun extends EnemyState
var direction: Vector2
var animation_finished: bool = false
func init() -> void:
enemy.EnemyDamaged.connect(_on_enemy_damaged)
pass
func Enter() -> void:
enemy.invulnerable = true
animation_finished = false
direction = enemy.global_position.direction_to(enemy.player.global_position)
enemy.SetDirection(direction)
enemy.velocity = direction * -knockback_speed
enemy.UpdateAnimation(anmi_name)
enemy.animation_player.animation_finished.connect(_on_animation_finsihed)
pass
func Exit() -> void:
enemy.invulnerable = false
enemy.animation_player.animation_finished.disconnect(_on_animation_finsihed)
pass
func Process(_delta: float) -> EnemyState:
if animation_finished:
return next_state
enemy.velocity -= enemy.velocity * decelebrate_speed * _delta
return null
func PhysicsProcess(_delta: float) -> EnemyState:
return null
func _on_enemy_damaged() -> void:
state_machine.ChangeState(self)
func _on_animation_finsihed(_a: String) -> void:
animation_finished = true - Destroy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41class_name EnemyStateDestroy extends EnemyState
var direction: Vector2
func init() -> void:
enemy.EnemyDestroyed.connect(_on_enemy_destroyed)
pass
func Enter() -> void:
enemy.invulnerable = true
direction = enemy.global_position.direction_to(enemy.player.global_position)
enemy.SetDirection(direction)
enemy.velocity = direction * -knockback_speed
enemy.UpdateAnimation(anmi_name)
enemy.animation_player.animation_finished.connect(_on_animation_finsihed)
pass
func Exit() -> void:
enemy.invulnerable = false
enemy.animation_player.animation_finished.disconnect(_on_animation_finsihed)
pass
func Process(_delta: float) -> EnemyState:
enemy.velocity -= enemy.velocity * decelebrate_speed * _delta
return null
func PhysicsProcess(_delta: float) -> EnemyState:
return null
func _on_enemy_destroyed() -> void:
state_machine.ChangeState(self)
func _on_animation_finsihed(_a: String) -> void:
enemy.queue_free()
- Stun
- 创建Destroy动画
- 添加HitBox节点
小结
- 动画可以通过多个Track组合
- Player击中HitBox,触发 HitBox的damaged信号
- Enemy接收到信号触发takeDamaged方法,扣除hp,根据hp状态选择发送受伤信号或者死亡信号
- stun节点监听受伤信号
- destroy节点监听死亡信号
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Have a nice day!!