TapestryEngine

A 2D Platformer Game Engine
Log | Files | Refs

30cf7540d369b6fa3356b2a66e7fd9bc267e039a.svn-base (2920B)


      1 #include "Animation.h"
      2 
      3 //FramesetFunctions
      4 FrameSet::FrameSet(SDL_Renderer* ren, const char* SourcePath, int FrameCount, int FRate, int frameH, int frameW)
      5 {
      6 	memset(mFrames, 0, 256);
      7 //	gCons->ConsPrintf("image source path: %s\n", SourcePath);
      8 	mframesource = SDL_CreateTextureFromSurface(ren, LoadSurfaceBMP(SourcePath));
      9 	mFrameCount = (FrameCount - 1);
     10 	mDefaultFrameRate = FRate;
     11 
     12 	SDL_Rect framerect;
     13 	framerect.h = frameH;
     14 	framerect.w = frameW;
     15 	framerect.x = 0;
     16 	framerect.y = 0;
     17 
     18 	int i = 0;
     19 	while (i <= mFrameCount)
     20 	{
     21 
     22 		framerect.x = ((i)*frameW);
     23 
     24 		mFrames[i] = framerect;
     25 
     26 		i++;
     27 	}
     28 }
     29 
     30 //animation Functions
     31 animation::animation(FrameSet* set, int ID, bool flip) : mID(ID)
     32 {
     33 	mFrameSet = set;
     34 	mCurrentFrameNumber = 0;
     35 	mFrameRate = mFrameSet->GetDefaultFrameRate();
     36 	mTimer = 0;
     37 	mIsFlippable = flip;
     38 	mIsPlaying = false;
     39 	mCurrentFrame.FrameSource = mFrameSet->GetFrameSource();
     40 	mCurrentFrame.FrameRect = mFrameSet->GetFrameRect(mCurrentFrameNumber);
     41 }
     42 
     43 Frame animation::GetCurrentFrame()
     44 {
     45 	mCurrentFrame.FrameRect = mFrameSet->GetFrameRect(mCurrentFrameNumber);
     46 	if (mIsPlaying == true)
     47 	{
     48 		if ((gTime->GetCurrentMS() - mTimer) >= mFrameRate)
     49 		{
     50 			if (mCurrentFrameNumber == mFrameSet->GetNumberOfFrames())
     51 			{
     52 				if (mFlags == ONCE)
     53 				{
     54 					Stop();
     55 					mFeed.EventProcess(Event(ANIM_COMPLETE, mID));
     56 					//gCons->ConsPrintf("Animation Complete\n");
     57 				}
     58 
     59 				mCurrentFrameNumber = 0;
     60 			}
     61 			else
     62 			{
     63 				mCurrentFrameNumber = (mCurrentFrameNumber + 1);
     64 			}
     65 			mTimer = gTime->GetCurrentMS();
     66 		}
     67 	}
     68 	return mCurrentFrame;
     69 }
     70 
     71 //AnimDataPack Functions
     72 AnimDataPack::AnimDataPack(int AnimCount, FrameSet* AnimData, int* Index)
     73 {
     74 	mAnimData = AnimData;
     75 	mIndexer = Index;
     76 	mAnimCount = AnimCount;
     77 }
     78 
     79 FrameSet* AnimDataPack::GetAnimationData(int AnimationID)
     80 {
     81 	for (int i = 0; i < mAnimCount; i++)
     82 	{
     83 		if (mIndexer[i] == AnimationID)
     84 		{
     85 			return &mAnimData[i];
     86 		}
     87 	}
     88 	gCons->ConsPrintf("Invalid Animation ID; Could not find Animation Data\n");
     89 	return NULL;
     90 }
     91 
     92 //AnimPack Functions
     93 AnimPack::AnimPack(AnimDataPack* data)
     94 {
     95 	mData = data;
     96 	mLastIndex = 0;
     97 
     98 	mAnims = new animation[mData->GetAnimCount()]; //needs a free?
     99 	for (int i = 0; i < mData->GetAnimCount(); i++)
    100 	{
    101 		mAnims[i] = animation( mData->GetAnimationData(mData->GetIndex(i)), mData->GetIndex(i) ); //make sure mData->GetIndex(i) returns correct ID
    102 	}
    103 }
    104 
    105 animation* AnimPack::ActivateAnimation(int AnimationID, int flags)
    106 {
    107 	for (int i = 0; i < mData->GetAnimCount(); i++)
    108 	{
    109 		if (mData->GetIndex(i) == AnimationID)
    110 		{
    111 			if (mLastIndex != i)
    112 			{
    113 				mAnims[mLastIndex].Stop();
    114 				mLastIndex = i;
    115 			}
    116 
    117 			mAnims[i].Play(flags);
    118 			return &mAnims[i];
    119 		}
    120 	}
    121 	gCons->ConsPrintf("Invalid Animation ID; Could not find Animation\n");
    122 	return NULL;
    123 
    124 }
    125 
    126 bool FrameCompare(Frame f1, Frame f2)
    127 {
    128 	if (f1.FrameSource == f2.FrameSource)
    129 	{
    130 		if (f1.FrameRect.x == f2.FrameRect.x)
    131 		{
    132 			return true;
    133 		}
    134 	}
    135 	return false;
    136 }