Ver código fonte

Merge pull request #132 from blackberry-gaming/next-kcunney

Fix for glitch in playback of Animation's with negative speed.
Sean Paul Taylor 14 anos atrás
pai
commit
0262a5f026
1 arquivos alterados com 9 adições e 6 exclusões
  1. 9 6
      gameplay/src/AnimationClip.cpp

+ 9 - 6
gameplay/src/AnimationClip.cpp

@@ -251,9 +251,14 @@ bool AnimationClip::update(unsigned long elapsedTime, std::list<AnimationTarget*
 {
 {
     if (!isClipStateBitSet(CLIP_IS_STARTED_BIT))
     if (!isClipStateBitSet(CLIP_IS_STARTED_BIT))
         onBegin();
         onBegin();
-    else 
+    else
+    {
         _elapsedTime += elapsedTime * _speed;
         _elapsedTime += elapsedTime * _speed;
 
 
+        if (_repeatCount == REPEAT_INDEFINITE && _elapsedTime <= 0)
+            _elapsedTime = _activeDuration + _elapsedTime;
+    }
+
     unsigned long currentTime = 0L;
     unsigned long currentTime = 0L;
     // Check to see if clip is complete.
     // Check to see if clip is complete.
     if (_repeatCount != REPEAT_INDEFINITE && ((_speed >= 0.0f && _elapsedTime >= (long) _activeDuration) || (_speed <= 0.0f && _elapsedTime <= 0L)))
     if (_repeatCount != REPEAT_INDEFINITE && ((_speed >= 0.0f && _elapsedTime >= (long) _activeDuration) || (_speed <= 0.0f && _elapsedTime <= 0L)))
@@ -401,21 +406,19 @@ void AnimationClip::onBegin()
     setClipStateBit(CLIP_IS_STARTED_BIT);
     setClipStateBit(CLIP_IS_STARTED_BIT);
     if (_speed >= 0)
     if (_speed >= 0)
     {
     {
-        _elapsedTime = 0;
+        _elapsedTime = (Game::getGameTime() - _timeStarted) * _speed;
 
 
         if (_listeners)
         if (_listeners)
             *_listenerItr = _listeners->begin(); 
             *_listenerItr = _listeners->begin(); 
     }
     }
     else
     else
     {
     {
-        _elapsedTime = _activeDuration;
+        _elapsedTime = _activeDuration + (Game::getGameTime() - _timeStarted) * _speed;
 
 
         if (_listeners)
         if (_listeners)
             *_listenerItr = _listeners->end();
             *_listenerItr = _listeners->end();
     }
     }
-
-    _elapsedTime += (Game::getGameTime() - _timeStarted) * _speed;
-
+    
     // Notify begin listeners.. if any.
     // Notify begin listeners.. if any.
     if (_beginListeners)
     if (_beginListeners)
     {
     {