class_name BalleElectrique extends Balle # Balle electrique qui fait des degats a distance quand chargee signal charge signal decharge const BalleElectriqueScene: PackedScene = preload("res://composants/objets/balle/balle_elec/balle_electrique.tscn") const duree_clignotement_max: float = 0.05 # sec var _duree_clignotement: float = 0.0 var surchargee: bool = true # vrai si l'electricite deborde @onready var image: Sprite2D = $ImageSurcharge func _process(delta: float) -> void: _clignoter(delta) func electrise(brique: Brique) -> void: assert(surchargee, "Ne peut pas electriser si non chargee") brique.frapper(1) surchargee = false decharge.emit() func recharge() -> void: surchargee = true charge.emit() func _impacter_brique(brique: Brique) -> void: super._impacter_brique(brique) if surchargee: electrise(brique) ## La balle electrique se recharge au contact de la raquette func _mettre_en_mouvement(dir: Vector2) -> void: super._mettre_en_mouvement(dir) recharge() ## Effet graphique electrique func _clignoter(delta: float) -> void: if not surchargee: return _duree_clignotement += delta if _duree_clignotement < duree_clignotement_max: # trop tot pour clignoter return # pas de 0, donc au moins un axe est flip var axes_a_inverser: int = randi_range(1, 3) var inversion_horizontale: bool = axes_a_inverser % 2 == 1 var inversion_verticale: bool = axes_a_inverser / 2 == 1 if inversion_verticale: image.flip_v = not image.flip_v if inversion_horizontale: image.flip_h = not image.flip_h image.set_rotation(randf_range(0.0, 2 * PI)) _duree_clignotement = 0.0 ## Transforme une balle quelconque en balle electrique static func transformer(balle: Balle) -> void: var balle_elec: BalleElectrique = BalleElectriqueScene.instantiate() balle.add_sibling.call_deferred(balle_elec) # Appeler plus tard sinon Godot pas content balle_elec.recopier(balle) balle.queue_free() func _quand_champ_electrique_detecte_coprs(body: Node2D) -> void: if surchargee and body is Brique: electrise(body)