Merge pull request #27153 from YeldhamDev/animsprite_backwards

Make AnimatedSprite able to play backwards
This commit is contained in:
Rémi Verschelde 2019-04-05 15:47:30 +02:00 committed by GitHub
commit 9d4093a21d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 8 deletions

View File

@ -24,7 +24,7 @@
<argument index="0" name="anim" type="String" default="&quot;&quot;">
</argument>
<description>
Play the animation set in parameter. If no parameter is provided, the current animation is played.
Play the animation set in parameter. If no parameter is provided, the current animation is played. Property [code]backwards[/code] plays the animation in reverse if set to [code]true[/code].
</description>
</method>
<method name="stop">

View File

@ -393,18 +393,29 @@ 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)) {
if (backwards)
frame = fc - 1;
else
frame = 0;
emit_signal(SceneStringNames::get_singleton()->animation_finished);
} else {
if (backwards)
frame = 0;
else
frame = fc - 1;
if (!is_over) {
is_over = true;
emit_signal(SceneStringNames::get_singleton()->animation_finished);
}
}
} else {
if (backwards)
frame--;
else
frame++;
}
@ -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;

View File

@ -128,6 +128,7 @@ class AnimatedSprite : public Node2D {
Ref<SpriteFrames> frames;
bool playing;
bool backwards;
StringName animation;
int frame;
float speed_scale;
@ -169,7 +170,7 @@ public:
void set_sprite_frames(const Ref<SpriteFrames> &p_frames);
Ref<SpriteFrames> get_sprite_frames() const;
void play(const StringName &p_animation = StringName());
void play(const StringName &p_animation = StringName(), const bool p_backwards = false);
void stop();
bool is_playing() const;