|
@@ -393,19 +393,30 @@ void AnimatedSprite::_notification(int p_what) {
|
|
|
timeout = _get_frame_duration();
|
|
|
|
|
|
int fc = frames->get_frame_count(animation);
|
|
|
- if (frame >= fc - 1) {
|
|
|
+ if ((!backwards && frame >= fc - 1) || (backwards && frame <= 0)) {
|
|
|
if (frames->get_animation_loop(animation)) {
|
|
|
- frame = 0;
|
|
|
+ if (backwards)
|
|
|
+ frame = fc - 1;
|
|
|
+ else
|
|
|
+ frame = 0;
|
|
|
+
|
|
|
emit_signal(SceneStringNames::get_singleton()->animation_finished);
|
|
|
} else {
|
|
|
- frame = fc - 1;
|
|
|
+ if (backwards)
|
|
|
+ frame = 0;
|
|
|
+ else
|
|
|
+ frame = fc - 1;
|
|
|
+
|
|
|
if (!is_over) {
|
|
|
is_over = true;
|
|
|
emit_signal(SceneStringNames::get_singleton()->animation_finished);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- frame++;
|
|
|
+ if (backwards)
|
|
|
+ frame--;
|
|
|
+ else
|
|
|
+ frame++;
|
|
|
}
|
|
|
|
|
|
update();
|
|
@@ -594,10 +605,12 @@ bool AnimatedSprite::_is_playing() const {
|
|
|
return playing;
|
|
|
}
|
|
|
|
|
|
-void AnimatedSprite::play(const StringName &p_animation) {
|
|
|
+void AnimatedSprite::play(const StringName &p_animation, const bool p_backwards) {
|
|
|
|
|
|
if (p_animation)
|
|
|
set_animation(p_animation);
|
|
|
+
|
|
|
+ backwards = p_backwards;
|
|
|
_set_playing(true);
|
|
|
}
|
|
|
|
|
@@ -666,7 +679,7 @@ void AnimatedSprite::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("_set_playing", "playing"), &AnimatedSprite::_set_playing);
|
|
|
ClassDB::bind_method(D_METHOD("_is_playing"), &AnimatedSprite::_is_playing);
|
|
|
|
|
|
- ClassDB::bind_method(D_METHOD("play", "anim"), &AnimatedSprite::play, DEFVAL(StringName()));
|
|
|
+ ClassDB::bind_method(D_METHOD("play", "anim", "backwards"), &AnimatedSprite::play, DEFVAL(StringName()));
|
|
|
ClassDB::bind_method(D_METHOD("stop"), &AnimatedSprite::stop);
|
|
|
ClassDB::bind_method(D_METHOD("is_playing"), &AnimatedSprite::is_playing);
|
|
|
|
|
@@ -713,6 +726,7 @@ AnimatedSprite::AnimatedSprite() {
|
|
|
frame = 0;
|
|
|
speed_scale = 1.0f;
|
|
|
playing = false;
|
|
|
+ backwards = false;
|
|
|
animation = "default";
|
|
|
timeout = 0;
|
|
|
is_over = false;
|