Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 46 additions & 3 deletions scenes/game_elements/props/projectile/components/projectile.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of using a Timer node to do the blinking, it would be better to use a Tween.

But this leads to my main feedback, whether or not to animate the blink effect programmatically. I'll comment about it separately.

#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()
Expand All @@ -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:
Comment on lines +144 to +145

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The DurationTimer node is already tracking the time, you could check its time_left property. Or even better, create a separate Timer for this, and call it StartBlinkingTimer.

The _ready() method already does:

	duration_timer.wait_time = duration
	duration_timer.start()

So that's the place to setup the new timer:

	duration_timer.wait_time = duration
	duration_timer.start()
	start_blinking_timer.wait_time = duration - blink_times * blink_duration

is_dissapearing = true
blink_timer.start()



## Add a small effect scene to the current scene in the current position.
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Loading