Browse Source

Merge pull request #25776 from luizcarlos1405/master

Fixes some AnimationPlayer bugs
Rémi Verschelde 6 years ago
parent
commit
325efb60b7
2 changed files with 14 additions and 3 deletions
  1. 4 1
      doc/classes/AnimationPlayer.xml
  2. 10 2
      scene/animation/animation_player.cpp

+ 4 - 1
doc/classes/AnimationPlayer.xml

@@ -145,6 +145,7 @@
 			</argument>
 			</argument>
 			<description>
 			<description>
 				Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the animation backwards.
 				Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the animation backwards.
+				If the animation has been paused by [code]stop(true)[/code] it will be resumed. Calling [code]play()[/code] without arguments will also resume the animation.
 			</description>
 			</description>
 		</method>
 		</method>
 		<method name="play_backwards">
 		<method name="play_backwards">
@@ -156,6 +157,7 @@
 			</argument>
 			</argument>
 			<description>
 			<description>
 				Play the animation with key [code]name[/code] in reverse.
 				Play the animation with key [code]name[/code] in reverse.
+				If the animation has been paused by [code]stop(true)[/code] it will be resumed backwards. Calling [code]play_backwards()[/code] without arguments will also resume the animation backwards.
 			</description>
 			</description>
 		</method>
 		</method>
 		<method name="queue">
 		<method name="queue">
@@ -217,7 +219,8 @@
 			<argument index="0" name="reset" type="bool" default="true">
 			<argument index="0" name="reset" type="bool" default="true">
 			</argument>
 			</argument>
 			<description>
 			<description>
-				Stop the currently playing animation. If [code]reset[/code] is [code]true[/code], the anim position is reset to [code]0[/code].
+				Stop the currently playing animation. If [code]reset[/code] is [code]true[/code], the animation position is reset to [code]0[/code] and the playback speed is reset to [code]1.0[/code].
+				If [code]reset[/code] is [code]false[/code], then calling [code]play()[/code] without arguments or [code]play("same_as_before")[/code] will resume the animation. Works the same for the [code]play_backwards()[/code] method.
 			</description>
 			</description>
 		</method>
 		</method>
 	</methods>
 	</methods>

+ 10 - 2
scene/animation/animation_player.cpp

@@ -1205,9 +1205,16 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float
 	_stop_playing_caches();
 	_stop_playing_caches();
 
 
 	c.current.from = &animation_set[name];
 	c.current.from = &animation_set[name];
-	c.current.pos = p_from_end ? c.current.from->animation->get_length() : 0;
+
+	if (c.assigned != name) { // reset
+		c.current.pos = p_from_end ? c.current.from->animation->get_length() : 0;
+	} else if (p_from_end && c.current.pos == 0) {
+		// Animation reset BUT played backwards, set position to the end
+		c.current.pos = c.current.from->animation->get_length();
+	}
+
 	c.current.speed_scale = p_custom_scale;
 	c.current.speed_scale = p_custom_scale;
-	c.assigned = p_name;
+	c.assigned = name;
 	c.seeked = false;
 	c.seeked = false;
 	c.started = true;
 	c.started = true;
 
 
@@ -1286,6 +1293,7 @@ void AnimationPlayer::stop(bool p_reset) {
 	if (p_reset) {
 	if (p_reset) {
 		c.current.from = NULL;
 		c.current.from = NULL;
 		c.current.speed_scale = 1;
 		c.current.speed_scale = 1;
+		c.current.pos = 0;
 	}
 	}
 	_set_process(false);
 	_set_process(false);
 	queued.clear();
 	queued.clear();