Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/CSpriteAnimation.cpp
blob: f759208dac4f2d70925fd9b04a7668ace9233ecd (plain)
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "CSpriteAnimation.h"

CSpriteAnimation::CSpriteAnimation(void)
{
	mBuilt = false;
}

CSpriteAnimation::CSpriteAnimation(const char *aFile, int aFrames, int aColumns, int aRows, int aFrameWidth, int aFrameHeight, bool aFlippableH, bool aFlippableV)
{
	int flipCounter = 0;

	mBuilt = false;

	mNumFrames = aFrames;
	mWidth = aFrameWidth;
	mHeight = aFrameHeight;

	CSurface *allFramesSurface = new CSurface(aFile);

	for (int i=0; i < mNumFrames; i++)
	{
		CSurface *tempSurface = new CSurface(mWidth, mHeight);
		CSurface::drawImage(tempSurface, allFramesSurface, 0, 0, (i % aColumns) * aFrameWidth, (i / aColumns) * aFrameHeight, aFrameWidth, aFrameHeight);
		mFrame.push_back(new CSpriteFrame(tempSurface));
	}

	allFramesSurface->destroy();
	allFramesSurface = NULL;

	mFlippableH = aFlippableH;
	mFlippableV = aFlippableV;

	if (mFlippableH)
	{
		flipCounter++;
		mStartFrameFlipH = mNumFrames * flipCounter;

		for (int i=0; i < mNumFrames; i++)
		{
			CSurface *tempSurface = new CSurface(getFrame(i)->getImage()->getImage(), CSurface::FLIP_HORIZONTAL);
			mFrame.push_back(new CSpriteFrame(tempSurface));
		}
	}

	if (mFlippableV)
	{
		flipCounter++;
		mStartFrameFlipV = mNumFrames * flipCounter;

		for (int i=0; i < mNumFrames; i++)
		{
			CSurface *tempSurface = new CSurface(getFrame(i)->getImage()->getImage(), CSurface::FLIP_VERTICAL);
			mFrame.push_back(new CSpriteFrame(tempSurface));
		}
	}

	if (mFlippableH && mFlippableV)
	{
		flipCounter++;
		mStartFrameFlipHV = mNumFrames * flipCounter;

		for (int i=0; i < mNumFrames; i++)
		{
			CSurface *tempSurface = new CSurface(getFrame(i)->getImage()->getImage(), CSurface::FLIP_HORIZONTAL | CSurface::FLIP_VERTICAL);
			mFrame.push_back(new CSpriteFrame(tempSurface));
		}
	}

	mBuilt = true;

	flipCounter++;
	mNumFrames = mNumFrames * flipCounter;
}

CSpriteAnimation::~CSpriteAnimation(void)
{
	destroy();
	mBuilt = false;
}

void CSpriteAnimation::destroy(void)
{
	for (int i=0; i < mNumFrames; i++)
	{
		if (mFrame[i] != NULL)
		{
			mFrame[i]->destroy();
			mFrame[i] = NULL;
		}
	}
	mFrame.clear();
}

int CSpriteAnimation::getWidth(void)
{
	return mWidth;
}

int CSpriteAnimation::getHeight(void)
{
	return mHeight;
}

int CSpriteAnimation::getNumFrames(void)
{
	return mNumFrames;
}

bool CSpriteAnimation::isBuilt(void)
{
	return mBuilt;
}

CSpriteFrame *CSpriteAnimation::getFrame(int aFrameIndex)
{
	return mFrame[aFrameIndex];
}