diff --git a/scenes/game_elements/props/projectile/components/projectile.gd b/scenes/game_elements/props/projectile/components/projectile.gd index 99f35d918f..5111d384d0 100644 --- a/scenes/game_elements/props/projectile/components/projectile.gd +++ b/scenes/game_elements/props/projectile/components/projectile.gd @@ -65,6 +65,13 @@ extends RigidBody2D var _trail_particles: GPUParticles2D +#Attributes that control the blinking effect +var time_passed: float = 0.0 +var time_to_dissapear: float = 0.0 +var is_dissapearing: bool = false +var blink_effect: bool = true +var blink_timer: Timer + @onready var visible_things: Node2D = %VisibleThings @onready var animated_sprite_2d: AnimatedSprite2D = %AnimatedSprite2D @onready var trail_fx_marker: Marker2D = %TrailFXMarker @@ -111,7 +118,19 @@ func _ready() -> void: duration_timer.start() var impulse: Vector2 = direction * speed apply_impulse(impulse) - + + ##the effect will start when the projectile has spent 70% of its lifetime + time_to_dissapear = duration * 0.7 + + blink_timer = Timer.new() + #each 0.25 seconds the blink effect will show + blink_timer.wait_time = 0.25 + blink_timer.one_shot = false + blink_timer.timeout.connect(_on_blink_timer_timeout) + + add_child(blink_timer) + + func _process(_delta: float) -> void: visible_things.rotation = linear_velocity.angle() @@ -121,6 +140,12 @@ func _process(_delta: float) -> void: ) var force: Vector2 = direction_to_target * speed constant_force = force + + time_passed += _delta + if time_passed >= time_to_dissapear && not is_dissapearing: + is_dissapearing = true + blink_timer.start() + ## Add a small effect scene to the current scene in the current position. @@ -136,7 +161,12 @@ func add_small_fx() -> void: func _on_body_entered(body: Node2D) -> void: add_small_fx() - duration_timer.start() + + # Logic for the dissapear animation + # When the proyectile is dissapearing, the duration_timer will not reset + if not is_dissapearing: + duration_timer.start() + time_passed = 0.0 # Logic for Fragile Barrel # We must check for the specific subclass first because it inherits from FillingBarrel @@ -157,7 +187,12 @@ func _on_body_entered(body: Node2D) -> void: ## enters the repel area. func got_repelled(repel_direction: Vector2) -> void: add_small_fx() - duration_timer.start() + + # When the proyectile is dissapearing, the duration_timer will not reset + if not is_dissapearing: + duration_timer.start() + time_passed = 0.0 + var hit_vector: Vector2 = repel_direction * hit_speed hit_sound.play() animated_sprite_2d.speed_scale = 2 @@ -186,3 +221,11 @@ func _on_duration_timer_timeout() -> void: func remove() -> void: await get_tree().create_timer(randf_range(0., 3.)).timeout explode() + +func _on_blink_timer_timeout() -> void: + if blink_effect: + animated_sprite_2d.modulate.a = 0.2 + blink_effect = false + else: + animated_sprite_2d.modulate.a = 0.8 + blink_effect = true