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();
13 Real verticalVelocity
= (path
.length() - mHalfTotalDistance
) * mFlyingAltitude
;
15 if (path
.length() > distanceMoved
|| mParticleNode
)
20 if (verticalVelocity
<= 0)
26 if (mAttackDuration
>= 0)
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"));
43 mAttackDuration
-= timeSinceLastFrame
;
50 SceneNode::ObjectIterator itr
= mParticleNode
->getAttachedObjectIterator();
51 while (itr
.hasMoreElements())
53 MovableObject
* object
= itr
.getNext();
54 mSceneMgr
->destroyMovableObject(object
);
56 mAnimatedNode
->removeAndDestroyChild(mParticleNode
->getName());
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.
72 mAnimatedNode
->translate(path
* distanceMoved
);
74 mAnimatedNode
->resetOrientation();
75 Vector3 src
= Vector3::UNIT_Z
;
76 mAnimatedNode
->rotate(src
.getRotationTo(path
));
80 Real pitch
= realPath
.length() * 45 / mHalfTotalDistance
;
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
);