1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
#include "sprite.h"
#include "spritedata.h"
Sprite::Sprite(SpriteData *_spritedata)
:
spritedata(_spritedata)
{
currentFrame = 0;
deltaFrame = 1;
speedAnimation = spritedata->getAnimationSpeed() / 1000.0f;
finished = false;
updateTime = 0.0f;
}
void Sprite::setAnimationSpeed(float speed)
{
speedAnimation = speed;
}
void Sprite::setFrame(int frame)
{
if(frame < 0)
currentFrame = 0;
else if(frame >= spritedata->getTotalFrames())
currentFrame = spritedata->getTotalFrames() - 1;
else
currentFrame = frame;
}
int Sprite::getFrame() const
{
return currentFrame;
}
void Sprite::finish()
{
finished = true;
}
void Sprite::restart()
{
finished = false;
currentFrame = 0;
}
bool Sprite::isFinished() const
{
return finished;
}
void Sprite::draw(int x, int y, float angle) const
{
if(finished == false)
{
angle -= spritedata->getInitialAngle();
while (angle < 0) angle += 360;
while (angle > 360) angle -= 360;
spritedata->draw(x, y, currentFrame, angle);
}
}
void Sprite::update(float timeElapsed)
{
int totalFrames = spritedata->getTotalFrames();
if(speedAnimation == 0 || totalFrames < 2 || finished)
return;
bool playPingPong = spritedata->isPingPong();
bool playLoop = spritedata->isLoop();
updateTime += timeElapsed;
while(updateTime > speedAnimation)
{
updateTime -= speedAnimation;
currentFrame += deltaFrame;
// Beginning or end of loop ?
if(currentFrame >= totalFrames || currentFrame < 0)
{
if(playLoop == false)
{
finish();
return;
}
if(playPingPong == true)
{
deltaFrame = -deltaFrame; // Change direction
if(deltaFrame > 0)
currentFrame = 0;
else
currentFrame = totalFrames - 1;
}
else
currentFrame = 0; // Start from start
}
}
}
|