Commit 94f6c3a8 authored by Michael Alexsander's avatar Michael Alexsander Committed by Hein-Pieter van Braam-Stewart
Browse files

Make AnimatedSprite able to play backwards

(cherry picked from commit 4a2c4330)
parent 42fa2615
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,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">
+20 −6
Original line number Diff line number Diff line
@@ -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;
+2 −1
Original line number Diff line number Diff line
@@ -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;