12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- @icon("res://composants/objets/balle/SphereShape3D.svg")
- class_name Balle
- extends CharacterBody2D
- signal rebondi
- const ratio_diff_angle: float = PI * 0.005 # radian / px
- const ascension_min: float = 10.0 # px / sec
- const vitesse_initiale: float = 100.0 # px / sec
- const acceleration_par_touche: float = 50.0 # px / sec / touche
- @export var direction_initiale: Vector2 = Vector2.DOWN
- var _mouvement: Vector2
- var _vitesse: float = vitesse_initiale
- func _ready() -> void:
- _mettre_en_mouvement(direction_initiale)
- func _physics_process(delta: float) -> void:
- var impact: KinematicCollision2D = move_and_collide(_mouvement * delta)
- if impact == null:
- return # pas d'impact a gerer
- _rebondir(impact)
- var obstacle: Object = impact.get_collider()
- if obstacle is Raquette and en_train_de_monter():
- _orienter_tir(obstacle)
- _accelerer()
- elif obstacle is Brique:
- _impacter_brique(obstacle)
- func ralentir(diviseur: float) -> void:
- assert(diviseur > 1.0, "Valeur diviseur invalide pour ralentir")
- _vitesse /= diviseur
- _mettre_en_mouvement(_mouvement.normalized())
- ## Recopie les proprietes utiles de l'autre balle
- func recopier(autre_balle: Balle) -> void:
- position = autre_balle.position
- _vitesse = autre_balle._vitesse
- _mouvement = autre_balle._mouvement
- direction_initiale = _mouvement.normalized() # pour garder direction en cas d'ajout dans une scene
- func detruire() -> void:
- queue_free()
- func en_train_de_monter() -> bool:
- return _mouvement.y < 0.0
- func _rebondir(impact: KinematicCollision2D) -> void:
- _mouvement = _mouvement.bounce(impact.get_normal())
- rebondi.emit()
- func _orienter_tir(raquette: Raquette) -> void:
- var difference = global_position.x - raquette.position.x
- _mouvement = Vector2.UP.rotated(difference * ratio_diff_angle) * _mouvement.length()
- # empeche la balle de monter trop lentement
- _mouvement.y = min(_mouvement.y, -ascension_min)
- func _accelerer() -> void:
- _vitesse += acceleration_par_touche
- _mettre_en_mouvement(_mouvement.normalized())
- func _impacter_brique(brique: Brique) -> void:
- brique.frapper(1)
- ## Permet d'appliquer la vitesse dans la direction voulue
- ## si la direction est inchangée, donnez _mouvement.normalized()
- func _mettre_en_mouvement(dir: Vector2) -> void:
- _mouvement = dir * _vitesse
|