balle.gd 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. const vitesse_initiale: float = 100.0 # px / sec
  7. const acceleration_par_touche: float = 50.0 # px / sec / touche
  8. @export var direction_initiale: Vector2 = Vector2.DOWN
  9. var _mouvement: Vector2
  10. var _vitesse: float = vitesse_initiale
  11. func _ready() -> void:
  12. _mettre_en_mouvement(direction_initiale)
  13. func _physics_process(delta: float) -> void:
  14. var impact: KinematicCollision2D = move_and_collide(_mouvement * delta)
  15. if impact != null:
  16. _rebondir(impact)
  17. var obstacle: Object = impact.get_collider()
  18. if obstacle is Raquette:
  19. _orienter_tir(obstacle)
  20. _accelerer()
  21. elif obstacle is Brique:
  22. _impacter_brique(obstacle)
  23. func _rebondir(impact: KinematicCollision2D) -> void:
  24. _mouvement = _mouvement.bounce(impact.get_normal())
  25. func _orienter_tir(raquette: Raquette) -> void:
  26. var difference = global_position.x - raquette.position.x
  27. _mouvement = Vector2.UP.rotated(difference * ratio_diff_angle) * _mouvement.length()
  28. # empeche la balle de traverser la raquette
  29. if _mouvement.y > 0:
  30. _mouvement.y = -ascension_min
  31. func _accelerer() -> void:
  32. _vitesse += acceleration_par_touche
  33. _mettre_en_mouvement(_mouvement.normalized())
  34. func _impacter_brique(brique: Brique) -> void:
  35. brique.frapper(1)
  36. func _mettre_en_mouvement(dir: Vector2) -> void:
  37. _mouvement = dir * _vitesse
  38. func _auto_detruire() -> void:
  39. queue_free()
  40. func _quand_verificateur_visibilite_detecte_sortie_ecran():
  41. sortie_ecran.emit()
  42. _auto_detruire()