Browse Source

Updates frame timeout when changing speed scale

groud 7 years ago
parent
commit
d7f25f7adb
2 changed files with 19 additions and 11 deletions
  1. 18 11
      scene/2d/animated_sprite.cpp
  2. 1 0
      scene/2d/animated_sprite.h

+ 18 - 11
scene/2d/animated_sprite.cpp

@@ -361,7 +361,7 @@ void AnimatedSprite::_notification(int p_what) {
 
 				if (timeout <= 0) {
 
-					timeout = 1.0 / speed;
+					timeout = _get_frame_duration();
 
 					int fc = frames->get_frame_count(animation);
 					if (frame >= fc - 1) {
@@ -483,7 +483,13 @@ int AnimatedSprite::get_frame() const {
 
 void AnimatedSprite::set_speed_scale(float p_speed_scale) {
 
+	float elapsed = _get_frame_duration() - timeout;
+
 	speed_scale = MAX(p_speed_scale, 0.0f);
+
+	// We adapt the timeout so that the animation speed adapts as soon as the speed scale is changed
+	_reset_timeout();
+	timeout -= elapsed;
 }
 
 float AnimatedSprite::get_speed_scale() const {
@@ -574,21 +580,22 @@ bool AnimatedSprite::is_playing() const {
 	return playing;
 }
 
-void AnimatedSprite::_reset_timeout() {
-
-	if (!playing)
-		return;
-
+float AnimatedSprite::_get_frame_duration() {
 	if (frames.is_valid() && frames->has_animation(animation)) {
 		float speed = frames->get_animation_speed(animation) * speed_scale;
 		if (speed > 0) {
-			timeout = 1.0 / speed;
-		} else {
-			timeout = 0;
+			return 1.0 / speed;
 		}
-	} else {
-		timeout = 0;
 	}
+	return 0.0;
+}
+
+void AnimatedSprite::_reset_timeout() {
+
+	if (!playing)
+		return;
+
+	timeout = _get_frame_duration();
 }
 
 void AnimatedSprite::set_animation(const StringName &p_animation) {

+ 1 - 0
scene/2d/animated_sprite.h

@@ -141,6 +141,7 @@ class AnimatedSprite : public Node2D {
 
 	void _res_changed();
 
+	float _get_frame_duration();
 	void _reset_timeout();
 	void _set_playing(bool p_playing);
 	bool _is_playing() const;