Fixed initialization order in animation manager.
[NALCG.git] / src / view / kingmovementanimation.cpp
blob2b8522dd9409619e88b2168a77cacb27e8ad1d30
1 #include "kingmovementanimation.h"
3 #include "animationfactory.h"
4 #include "dyinganimation.h"
5 #include "bleedinganimation.h"
6 #include "animationmanager.h"
8 bool KingMovementAnimation::animate(const Real& timeSinceLastFrame)
10 Real distanceMoved = MOVEMENT_SPEED * timeSinceLastFrame;
11 Vector3 path = mDestination - mAnimatedNode->getPosition();
12 path.y = 0;
13 Real verticalVelocity = (path.length() - mHalfTotalDistance) * mFlyingAltitude;
15 if (path.length() > distanceMoved || mParticleNode)
17 switch (mPhase)
19 case 1:
20 if (verticalVelocity <= 0)
22 mPhase = 2;
24 break;
25 case 2:
26 if (mAttackDuration >= 0)
28 if (!mParticleNode)
30 createBlasts();
31 mAnimationManager->addAnimation(
32 AnimationFactory::createDyingAnimation(
33 mTargetPiece, mSceneMgr, 2, 3));
34 mAnimationManager->addAnimation(
35 AnimationFactory::createBleedingAnimation(
36 mTargetPiece, mSceneMgr, 0.2, 2.5));
37 mAnimationManager->addAnimation(
38 AnimationFactory::createBleedingAnimation(
39 mTargetPiece, mSceneMgr, 0.2, 2, "Effects/Smoke"));
42 distanceMoved = 0;
43 mAttackDuration -= timeSinceLastFrame;
45 else
47 mPhase = 3;
48 if (mParticleNode)
50 SceneNode::ObjectIterator itr = mParticleNode->getAttachedObjectIterator();
51 while (itr.hasMoreElements())
53 MovableObject* object = itr.getNext();
54 mSceneMgr->destroyMovableObject(object);
56 mAnimatedNode->removeAndDestroyChild(mParticleNode->getName());
57 mParticleNode = 0;
60 break;
64 if (distanceMoved > 0)
66 mAnimatedNode->translate(Vector3(0, verticalVelocity * timeSinceLastFrame, 0));
68 Vector3 realPath = path;
70 // Normalising the vector so the speed remains constant.
71 path.normalise();
72 mAnimatedNode->translate(path * distanceMoved);
74 mAnimatedNode->resetOrientation();
75 Vector3 src = Vector3::UNIT_Z;
76 mAnimatedNode->rotate(src.getRotationTo(path));
78 if (mTargetPiece)
80 Real pitch = realPath.length() * 45 / mHalfTotalDistance;
81 if (mPhase == 1)
83 pitch = 90 - pitch;
85 mAnimatedNode->pitch(Degree(pitch));
88 mAnimatedNode->yaw(Degree(realPath.length() * 360 / mHalfTotalDistance));
91 return true; // Animation still running.
94 mAnimatedNode->setPosition(mDestination);
95 mAnimatedNode->setOrientation(mAnimatedNode->getInitialOrientation());
96 return false; // Animation finished.
99 void KingMovementAnimation::createBlasts()
101 ParticleSystem* pSys = mSceneMgr->createParticleSystem(
102 nextName(), "Effects/EnergyBlast");
103 mParticleNode = mAnimatedNode->createChildSceneNode();
105 mParticleNode->translate(0, 160, 60);
106 mParticleNode->attachObject(pSys);
107 ParticleEmitter *emitter = pSys->getEmitter(0);
109 pSys->setParticleQuota(emitter->getEmissionRate() * mAttackDuration);