引入资源

  • 将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
      46
      class_name EnemyStateStun extends EnemyState

      @export var anmi_name: String = "stun"

      @export_category("AI")
      @export var knockback_speed: float = 200.0
      @export var decelebrate_speed: float = 10.0
      @export var next_state: 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
      41
      class_name EnemyStateDestroy extends EnemyState

      @export var anmi_name: String = "destroy"

      @export_category("AI")
      @export var knockback_speed: float = 200.0
      @export var decelebrate_speed: float = 10.0

      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()

  • 创建Destroy动画
  • 添加HitBox节点

小结

  • 动画可以通过多个Track组合
  • Player击中HitBox,触发 HitBox的damaged信号
  • Enemy接收到信号触发takeDamaged方法,扣除hp,根据hp状态选择发送受伤信号或者死亡信号
  • stun节点监听受伤信号
  • destroy节点监听死亡信号