File: sprite.cpp

package info (click to toggle)
clanlib 0.5.4-1-6
  • links: PTS
  • area: main
  • in suites: woody
  • size: 10,320 kB
  • ctags: 10,893
  • sloc: cpp: 76,056; xml: 3,281; sh: 2,961; perl: 1,204; asm: 837; makefile: 775
file content (100 lines) | stat: -rw-r--r-- 1,771 bytes parent folder | download
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
		}
	}
}