balle.gd 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. class_name Balle
  2. extends CharacterBody2D
  3. signal rebondi
  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. @export var direction_initiale: Vector2 = Vector2.DOWN
  8. var _mouvement: Vector2
  9. var _vitesse: float = vitesse_initiale
  10. func _ready() -> void:
  11. _mettre_en_mouvement(direction_initiale)
  12. func _physics_process(delta: float) -> void:
  13. var impact: KinematicCollision2D = move_and_collide(_mouvement * delta)
  14. if impact == null:
  15. return # pas d'impact a gerer
  16. _rebondir(impact)
  17. var obstacle: Object = impact.get_collider()
  18. if obstacle is Raquette and en_train_de_monter():
  19. _orienter_tir(obstacle)
  20. elif obstacle is Brique:
  21. _impacter_brique(obstacle)
  22. #func ralentir(diviseur: float) -> void:
  23. #assert(diviseur > 1.0, "Valeur diviseur invalide pour ralentir")
  24. #_vitesse /= diviseur
  25. #_mettre_en_mouvement(_mouvement.normalized())
  26. ## Recopie les proprietes utiles de l'autre balle
  27. func recopier(autre_balle: Balle) -> void:
  28. position = autre_balle.position
  29. _vitesse = autre_balle._vitesse
  30. _mouvement = autre_balle._mouvement
  31. direction_initiale = _mouvement.normalized() # pour garder direction en cas d'ajout dans une scene
  32. func detruire() -> void:
  33. queue_free()
  34. func en_train_de_monter() -> bool:
  35. return _mouvement.y < 0.0
  36. func _rebondir(impact: KinematicCollision2D) -> void:
  37. _mouvement = _mouvement.bounce(impact.get_normal())
  38. rebondi.emit()
  39. func _orienter_tir(raquette: Raquette) -> void:
  40. var difference = global_position.x - raquette.position.x
  41. _mouvement = Vector2.UP.rotated(difference * ratio_diff_angle) * _mouvement.length()
  42. # empeche la balle de monter trop lentement
  43. _mouvement.y = min(_mouvement.y, -ascension_min)
  44. func _accelerer() -> void:
  45. # modifier _vitesse ici pour accelerer
  46. _mettre_en_mouvement(_mouvement.normalized())
  47. func _impacter_brique(brique: Brique) -> void:
  48. brique.frapper(1)
  49. ## Permet d'appliquer la vitesse dans la direction voulue
  50. ## si la direction est inchangée, donnez _mouvement.normalized()
  51. func _mettre_en_mouvement(dir: Vector2) -> void:
  52. _mouvement = dir * _vitesse