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 }