Chicken.gd 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. class_name Chicken
  2. extends KinematicBody2D
  3. enum State {IDLE, WALKING, ANGRY, RUNNING}
  4. export var walk_linear_speed = 100
  5. export var run_boost = 4
  6. export var push_impulse = 100
  7. var velocity = Vector2.ZERO
  8. var _current_state = State.IDLE
  9. func attack(from: Vector2, angle: float):
  10. position = from
  11. velocity = Vector2(walk_linear_speed, 0).rotated(angle)
  12. $AnimatedSprite.play("walk")
  13. _update_sprite_direction()
  14. _current_state = State.WALKING
  15. func _physics_process(delta):
  16. var collision = move_and_collide(velocity * delta, false)
  17. _collide_and_react(collision)
  18. func _on_VisibilityNotifier2D_screen_exited():
  19. _die()
  20. func _on_Spawner_reset():
  21. _die()
  22. func _on_AngryTimer_timeout():
  23. assert(_current_state == State.ANGRY)
  24. _start_running()
  25. func _die():
  26. queue_free()
  27. func _collide_and_react(collision: KinematicCollision2D) -> void:
  28. if collision == null:
  29. return
  30. var collider = collision.get_collider()
  31. if collider is Node2D:
  32. var node_collider = collider as Node
  33. if _current_state == State.WALKING:
  34. if node_collider.is_in_group("chicken"):
  35. _turn_away()
  36. elif node_collider.is_in_group("wheel"):
  37. _get_angry()
  38. if collider is RigidBody2D:
  39. _push_away(collider as RigidBody2D, -collision.normal)
  40. func _turn_away() -> void:
  41. velocity.x = -velocity.x
  42. _update_sprite_direction()
  43. func _push_away(body: RigidBody2D, dir: Vector2) -> void:
  44. body.apply_central_impulse(dir * push_impulse)
  45. func _get_angry() -> void:
  46. $AngryTimer.start()
  47. $AnimatedSprite.play("get_hit")
  48. _current_state = State.ANGRY
  49. func _start_running() -> void:
  50. velocity *= run_boost
  51. $AnimatedSprite.play("run")
  52. _current_state = State.RUNNING
  53. func _update_sprite_direction() -> void:
  54. $AnimatedSprite.flip_h = velocity.x < 0.0