im making an animation play in a control node in the player hud in godot 4.2. this code i have doesn't work. the only thing that plays is ability started. how do i make them play in order? fix the code for me: func secondary() -> void: if !can_secondary: return can_secondary = false secondary_animated_sprite.play("ability started")
func secondary_anim_done() -> void:
secondary_animated_sprite.play("ability ended")
secondary_animated_sprite.play("ability cooldown")
secondary_animated_sprite.play("ability refreshed")
secondary_animated_sprite.stop()
can_secondary = true
To ensure that your animations play in order, you need to wait for each animation to finish before starting the next one. In Godot, you can use signals to detect when an animation has finished playing. The AnimatedSprite
node emits a animation_finished
signal when an animation completes. You can connect this signal to a function that will handle the next animation in the sequence.
Here's how you can modify your code to achieve this:
animation_finished
signal to a function that will handle the next animation.Here's an updated version of your code:
extends Control
var can_secondary: bool = true
var current_animation: int = 0
const ANIMATIONS = [
"ability started",
"ability ended",
"ability cooldown",
"ability refreshed"
]
@onready var secondary_animated_sprite: AnimatedSprite = $SecondaryAnimatedSprite
func _ready() -> void:
secondary_animated_sprite.connect("animation_finished", self, "_on_animation_finished")
func secondary() -> void:
if !can_secondary:
return
can_secondary = false
current_animation = 0
secondary_animated_sprite.play(ANIMATIONS[current_animation])
func _on_animation_finished() -> void:
current_animation += 1
if current_animation < ANIMATIONS.size():
secondary_animated_sprite.play(ANIMATIONS[current_animation])
else:
// Reset and allow secondary action again
can_secondary = true
current_animation = 0
ANIMATIONS
that holds the names of the animations in the order they should be played._ready()
function, we connect the animation_finished
signal of the AnimatedSprite
to the _on_animation_finished()
function.secondary()
function, we start playing the first animation and set current_animation
to 0._on_animation_finished()
function, we increment current_animation
and check if there are more animations to play. If there are, we play the next animation. If all animations have been played, we reset can_secondary
to true, allowing the secondary action to be triggered again.This way, your animations will play in the specified order, and the secondary action can only be triggered again after all animations have completed.