balle_electrique.gd 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. class_name BalleElectrique
  2. extends Balle
  3. # Balle electrique qui fait des degats a distance quand chargee
  4. signal charge
  5. signal decharge
  6. const BalleElectriqueScene: PackedScene = preload("res://composants/objets/balle/balle_elec/balle_electrique.tscn")
  7. const duree_clignotement_max: float = 0.05 # sec
  8. var _duree_clignotement: float = 0.0
  9. var surchargee: bool = true # vrai si l'electricite deborde
  10. @onready var image: Sprite2D = $ImageSurcharge
  11. func _process(delta: float) -> void:
  12. _clignoter(delta)
  13. func electrise(brique: Brique) -> void:
  14. assert(surchargee, "Ne peut pas electriser si non chargee")
  15. brique.frapper(1)
  16. surchargee = false
  17. decharge.emit()
  18. func recharge() -> void:
  19. surchargee = true
  20. charge.emit()
  21. ## La balle electrique se recharge au contact de la raquette
  22. func _mettre_en_mouvement(dir: Vector2) -> void:
  23. super._mettre_en_mouvement(dir)
  24. recharge()
  25. func _clignoter(delta: float) -> void:
  26. if not surchargee:
  27. return
  28. _duree_clignotement += delta
  29. if _duree_clignotement < duree_clignotement_max:
  30. # trop tot pour clignoter
  31. return
  32. # pas de 0, donc au moins un axe est flip
  33. var axes_a_inverser: int = randi_range(1, 3)
  34. var inversion_horizontale: bool = axes_a_inverser % 2 == 1
  35. var inversion_verticale: bool = axes_a_inverser / 2 == 1
  36. if inversion_verticale:
  37. image.flip_v = not image.flip_v
  38. if inversion_horizontale:
  39. image.flip_h = not image.flip_h
  40. _duree_clignotement = 0.0
  41. ## Transforme une balle quelconque en balle electrique
  42. static func transformer(balle: Balle) -> void:
  43. var balle_elec: BalleElectrique = BalleElectriqueScene.instantiate()
  44. balle.add_sibling.call_deferred(balle_elec) # Appeler plus tard sinon Godot pas content
  45. balle_elec.recopier(balle)
  46. balle.queue_free()
  47. func _quand_champ_electrique_detecte_coprs(body: Node2D) -> void:
  48. print(body, " dans champ electrique")
  49. if surchargee and body is Brique:
  50. electrise(body)