|
@@ -0,0 +1,41 @@
|
|
|
+class_name BalleSpectrale
|
|
|
+extends Balle
|
|
|
+
|
|
|
+
|
|
|
+const BalleDeSpectraleScene: PackedScene = preload("res://composants/objets/balle/balle_spectrale/balle_spectrale.tscn")
|
|
|
+const CALQUE_COLLISION_BRIQUE_INDEXE: int = 5
|
|
|
+const CALQUE_COLLISION_BRIQUE_ACTIVATION: int = pow(2, CALQUE_COLLISION_BRIQUE_INDEXE - 1)
|
|
|
+
|
|
|
+var _est_tangible: bool = true
|
|
|
+
|
|
|
+@onready var image_tangible: Sprite2D = $ImageTangible
|
|
|
+@onready var image_spectre: Sprite2D = $ImageSpectre
|
|
|
+
|
|
|
+
|
|
|
+func rendre_tangible(doit_etre_tangible: bool) -> void:
|
|
|
+ if doit_etre_tangible == _est_tangible:
|
|
|
+ return # etat demande deja atteint
|
|
|
+
|
|
|
+ image_tangible.visible = doit_etre_tangible
|
|
|
+ image_spectre.visible = not doit_etre_tangible
|
|
|
+
|
|
|
+ if doit_etre_tangible:
|
|
|
+ collision_mask += CALQUE_COLLISION_BRIQUE_ACTIVATION
|
|
|
+ else:
|
|
|
+ collision_mask -= CALQUE_COLLISION_BRIQUE_ACTIVATION
|
|
|
+
|
|
|
+ _est_tangible = doit_etre_tangible # l'etat courant a change
|
|
|
+
|
|
|
+
|
|
|
+## La spectrale redevient tangible au premier rebond
|
|
|
+func _rebondir(impact: KinematicCollision2D) -> void:
|
|
|
+ rendre_tangible(not impact.get_collider() is Raquette)
|
|
|
+ super._rebondir(impact)
|
|
|
+
|
|
|
+
|
|
|
+## Transforme une balle quelconque en balle de feu
|
|
|
+static func transformer(balle: Balle) -> void:
|
|
|
+ var balle_spectrale: BalleSpectrale = BalleDeSpectraleScene.instantiate()
|
|
|
+ balle.add_sibling.call_deferred(balle_spectrale) # Appeler plus tard sinon Godot pas content
|
|
|
+ balle_spectrale.recopier(balle)
|
|
|
+ balle.queue_free()
|