Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/CSpriteAnimation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/CSpriteAnimation.cpp')
-rwxr-xr-xsrc/CSpriteAnimation.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/CSpriteAnimation.cpp b/src/CSpriteAnimation.cpp
new file mode 100755
index 0000000..f759208
--- /dev/null
+++ b/src/CSpriteAnimation.cpp
@@ -0,0 +1,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];
+}