balle.gd 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. class_name Balle
  2. extends CharacterBody2D
  3. signal sortie_ecran
  4. const ratio_diff_angle: float = PI * 0.005 # radian / px
  5. const ascension_min: float = 10.0 # px / sec
  6. @export var mouvement_initial: Vector2 = Vector2(0.0, 600.0)
  7. var _mouvement: Vector2
  8. func _ready() -> void:
  9. _mouvement = mouvement_initial
  10. func _physics_process(delta: float) -> void:
  11. var impact: KinematicCollision2D = move_and_collide(_mouvement * delta)
  12. if impact != null:
  13. _rebondir(impact)
  14. var obstacle: Object = impact.get_collider()
  15. if obstacle is Raquette:
  16. _orienter_tir(obstacle)
  17. if obstacle.has_method("frapper"):
  18. obstacle.frapper(1)
  19. func _rebondir(impact: KinematicCollision2D) -> void:
  20. _mouvement = _mouvement.bounce(impact.get_normal())
  21. func _orienter_tir(raquette: Raquette) -> void:
  22. var difference = global_position.x - raquette.position.x
  23. _mouvement = Vector2.UP.rotated(difference * ratio_diff_angle) * _mouvement.length()
  24. # empeche la balle de traverser la raquette
  25. if _mouvement.y > 0:
  26. _mouvement.y = ascension_min
  27. func _auto_detruire() -> void:
  28. queue_free()
  29. func _quand_verificateur_visibilite_detecte_sortie_ecran():
  30. sortie_ecran.emit()
  31. _auto_detruire()