balle_electrique.gd 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. func _impacter_brique(brique: Brique) -> void:
  22. super._impacter_brique(brique)
  23. if surchargee:
  24. electrise(brique)
  25. ## La balle electrique se recharge au contact de la raquette
  26. func _mettre_en_mouvement(dir: Vector2) -> void:
  27. super._mettre_en_mouvement(dir)
  28. recharge()
  29. ## Effet graphique electrique
  30. func _clignoter(delta: float) -> void:
  31. if not surchargee:
  32. return
  33. _duree_clignotement += delta
  34. if _duree_clignotement < duree_clignotement_max:
  35. # trop tot pour clignoter
  36. return
  37. # pas de 0, donc au moins un axe est flip
  38. var axes_a_inverser: int = randi_range(1, 3)
  39. var inversion_horizontale: bool = axes_a_inverser % 2 == 1
  40. var inversion_verticale: bool = axes_a_inverser / 2 == 1
  41. if inversion_verticale:
  42. image.flip_v = not image.flip_v
  43. if inversion_horizontale:
  44. image.flip_h = not image.flip_h
  45. image.set_rotation(randf_range(0.0, 2 * PI))
  46. _duree_clignotement = 0.0
  47. ## Transforme une balle quelconque en balle electrique
  48. static func transformer(balle: Balle) -> void:
  49. var balle_elec: BalleElectrique = BalleElectriqueScene.instantiate()
  50. balle.add_sibling.call_deferred(balle_elec) # Appeler plus tard sinon Godot pas content
  51. balle_elec.recopier(balle)
  52. balle.queue_free()
  53. func _quand_champ_electrique_detecte_coprs(body: Node2D) -> void:
  54. if surchargee and body is Brique:
  55. electrise(body)