From dc6e664fda18ccc7a4a54f16ca64ef4049c9e47e Mon Sep 17 00:00:00 2001 From: Robocraft999 <59525378+Robocraft999@users.noreply.github.com> Date: Mon, 24 Jun 2024 14:30:25 +0200 Subject: [PATCH] Fix AnimationSprite2D/3D::play using wrong end_frame On playing a different animation to the current backwards will start the new animation on the last animations last frame not the new ones --- scene/2d/animated_sprite_2d.cpp | 5 ++++- scene/3d/sprite_3d.cpp | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scene/2d/animated_sprite_2d.cpp b/scene/2d/animated_sprite_2d.cpp index 6d380aed3cf2..3506a0df2b25 100644 --- a/scene/2d/animated_sprite_2d.cpp +++ b/scene/2d/animated_sprite_2d.cpp @@ -473,9 +473,10 @@ void AnimatedSprite2D::play(const StringName &p_name, float p_custom_scale, bool playing = true; custom_speed_scale = p_custom_scale; - int end_frame = MAX(0, frames->get_frame_count(animation) - 1); if (name != animation) { animation = name; + int end_frame = MAX(0, frames->get_frame_count(animation) - 1); + if (p_from_end) { set_frame_and_progress(end_frame, 1.0); } else { @@ -483,7 +484,9 @@ void AnimatedSprite2D::play(const StringName &p_name, float p_custom_scale, bool } emit_signal(SceneStringName(animation_changed)); } else { + int end_frame = MAX(0, frames->get_frame_count(animation) - 1); bool is_backward = signbit(speed_scale * custom_speed_scale); + if (p_from_end && is_backward && frame == 0 && frame_progress <= 0.0) { set_frame_and_progress(end_frame, 1.0); } else if (!p_from_end && !is_backward && frame == end_frame && frame_progress >= 1.0) { diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index ba3b32a0315c..d08aeb1de219 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -1334,9 +1334,10 @@ void AnimatedSprite3D::play(const StringName &p_name, float p_custom_scale, bool playing = true; custom_speed_scale = p_custom_scale; - int end_frame = MAX(0, frames->get_frame_count(animation) - 1); if (name != animation) { animation = name; + int end_frame = MAX(0, frames->get_frame_count(animation) - 1); + if (p_from_end) { set_frame_and_progress(end_frame, 1.0); } else { @@ -1344,7 +1345,9 @@ void AnimatedSprite3D::play(const StringName &p_name, float p_custom_scale, bool } emit_signal(SceneStringName(animation_changed)); } else { + int end_frame = MAX(0, frames->get_frame_count(animation) - 1); bool is_backward = signbit(speed_scale * custom_speed_scale); + if (p_from_end && is_backward && frame == 0 && frame_progress <= 0.0) { set_frame_and_progress(end_frame, 1.0); } else if (!p_from_end && !is_backward && frame == end_frame && frame_progress >= 1.0) {