AnimationController.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "Base.h"
  2. #include "AnimationController.h"
  3. #include "Game.h"
  4. #include "Curve.h"
  5. namespace gameplay
  6. {
  7. AnimationController::AnimationController()
  8. : _state(STOPPED)
  9. {
  10. }
  11. AnimationController::~AnimationController()
  12. {
  13. }
  14. void AnimationController::stopAllAnimations()
  15. {
  16. std::list<AnimationClip*>::iterator clipIter = _runningClips.begin();
  17. while (clipIter != _runningClips.end())
  18. {
  19. AnimationClip* clip = *clipIter;
  20. GP_ASSERT(clip);
  21. clip->stop();
  22. clipIter++;
  23. }
  24. }
  25. AnimationController::State AnimationController::getState() const
  26. {
  27. return _state;
  28. }
  29. void AnimationController::initialize()
  30. {
  31. _state = IDLE;
  32. }
  33. void AnimationController::finalize()
  34. {
  35. std::list<AnimationClip*>::iterator itr = _runningClips.begin();
  36. for ( ; itr != _runningClips.end(); itr++)
  37. {
  38. AnimationClip* clip = *itr;
  39. SAFE_RELEASE(clip);
  40. }
  41. _runningClips.clear();
  42. _state = STOPPED;
  43. }
  44. void AnimationController::resume()
  45. {
  46. if (_runningClips.empty())
  47. _state = IDLE;
  48. else
  49. _state = RUNNING;
  50. }
  51. void AnimationController::pause()
  52. {
  53. _state = PAUSED;
  54. }
  55. void AnimationController::schedule(AnimationClip* clip)
  56. {
  57. if (_runningClips.empty())
  58. {
  59. _state = RUNNING;
  60. }
  61. GP_ASSERT(clip);
  62. clip->addRef();
  63. _runningClips.push_back(clip);
  64. }
  65. void AnimationController::unschedule(AnimationClip* clip)
  66. {
  67. std::list<AnimationClip*>::iterator clipItr = _runningClips.begin();
  68. while (clipItr != _runningClips.end())
  69. {
  70. AnimationClip* rClip = (*clipItr);
  71. if (rClip == clip)
  72. {
  73. _runningClips.erase(clipItr);
  74. SAFE_RELEASE(clip);
  75. break;
  76. }
  77. clipItr++;
  78. }
  79. if (_runningClips.empty())
  80. _state = IDLE;
  81. }
  82. void AnimationController::update(float elapsedTime)
  83. {
  84. if (_state != RUNNING)
  85. return;
  86. Transform::suspendTransformChanged();
  87. // Loop through running clips and call update() on them.
  88. std::list<AnimationClip*>::iterator clipIter = _runningClips.begin();
  89. while (clipIter != _runningClips.end())
  90. {
  91. AnimationClip* clip = (*clipIter);
  92. GP_ASSERT(clip);
  93. if (clip->isClipStateBitSet(AnimationClip::CLIP_IS_RESTARTED_BIT))
  94. { // If the CLIP_IS_RESTARTED_BIT is set, we should end the clip and
  95. // move it from where it is in the running clips list to the back.
  96. clip->onEnd();
  97. clip->setClipStateBit(AnimationClip::CLIP_IS_PLAYING_BIT);
  98. _runningClips.push_back(clip);
  99. clipIter = _runningClips.erase(clipIter);
  100. }
  101. else if (clip->update(elapsedTime))
  102. {
  103. SAFE_RELEASE(clip);
  104. clipIter = _runningClips.erase(clipIter);
  105. }
  106. else
  107. {
  108. clipIter++;
  109. }
  110. }
  111. Transform::resumeTransformChanged();
  112. if (_runningClips.empty())
  113. _state = IDLE;
  114. }
  115. }