TapestryEngine

A 2D Platformer Game Engine
Log | Files | Refs

46a8f9654bc2905d76d6c7630f512ecc70d32b4d.svn-base (3024B)


      1 #include "AnimationGraph.h"
      2 
      3 //AnimGraphData functions
      4 bool AnimGraphData::DefineLoop(int AnimID)
      5 {
      6 	if (mAnimData.GetAnimationData(AnimID) != NULL)
      7 	{
      8 		mLoopsAnimIDs.push_back(AnimID);
      9 		return true;
     10 	}
     11 	else
     12 	{
     13 		gCons->ConsPrintf("Invalid animation ID, Animation Graph could not define loop\n");
     14 		return false;
     15 	}
     16 }
     17 
     18 bool AnimGraphData::DefineTransitions(int AnimID)
     19 {
     20 	if (mAnimData.GetAnimationData(AnimID) != NULL)
     21 	{
     22 		mTransitionsAnimIDs.push_back(AnimID);
     23 		//mAnimPack.GetAnimation(AnimID)->mFeed.Subscribe(this);
     24 		return true;
     25 	}
     26 	return false;
     27 }
     28 
     29 bool AnimGraphData::CreateTranisitionMatrix() //call only after all loops have been defined
     30 {
     31 	mTransitionMatrix = new int*[mLoopsAnimIDs.size()];
     32 
     33 	for (int i = 0; i < (int)mLoopsAnimIDs.size(); i++)
     34 	{
     35 		mTransitionMatrix[i] = new int[mLoopsAnimIDs.size()];
     36 		for (int j = 0; j < (int)mLoopsAnimIDs.size(); j++)
     37 		{
     38 			mTransitionMatrix[i][j] = -1; //-1 represents no transition
     39 		}
     40 	}
     41 	return true;
     42 }
     43 
     44 bool AnimGraphData::PopulateTransitionMatrix(int initState, int targetState, int transitionID)
     45 {
     46 	int initIndex = -1;
     47 	int targetIndex = -1;
     48 
     49 	for (int i = 0; i < (int)mLoopsAnimIDs.size(); i++)
     50 	{
     51 		if (initState == mLoopsAnimIDs.at(i))
     52 		{
     53 			initIndex = i;
     54 		}
     55 		if (targetState == mLoopsAnimIDs.at(i))
     56 		{
     57 			targetIndex = i;
     58 		}
     59 	}
     60 
     61 	if ((initIndex != -1) && (targetIndex != -1))
     62 	{
     63 		mTransitionMatrix[initIndex][targetIndex] = transitionID;
     64 		return true;
     65 	}
     66 	return false;
     67 }
     68 
     69 //Anim Graph Functions
     70 int AnimGraph::GetTransitionID(int initState, int targetState)
     71 {
     72 	int initIndex = -1;
     73 	int targetIndex = -1;
     74 
     75 	for (int i = 0; i < (int)mAGD->mLoopsAnimIDs.size(); i++)
     76 	{
     77 		if (initState == mAGD->mLoopsAnimIDs.at(i))
     78 		{
     79 			initIndex = i;
     80 		}
     81 		if (targetState == mAGD->mLoopsAnimIDs.at(i))
     82 		{
     83 			targetIndex = i;
     84 		}
     85 	}
     86 
     87 	if ((initIndex != -1) && (targetIndex != -1))
     88 	{
     89 		return mAGD->mTransitionMatrix[initIndex][targetIndex];
     90 	}
     91 	else
     92 	{
     93 		return -1;
     94 	}
     95 }
     96 
     97 Frame* AnimGraph::UpdateAnimation()
     98 {
     99 	if (mState != *mActorState)
    100 	{
    101 		if ( (GetTransitionID(mState, *mActorState) != -1) && mState != 0 )
    102 		{
    103 			mCurrentFrame = mAnimPack.ActivateAnimation(GetTransitionID(mState, *mActorState), ONCE)->GetCurrentFrame();
    104 			return &mCurrentFrame;
    105 		}
    106 		else
    107 		{
    108 			mState = *mActorState;
    109 			return &mCurrentFrame;
    110 		}
    111 	}
    112 	else
    113 	{
    114 		for (int i = 0; i < (int)mAGD->mLoopsAnimIDs.size(); i++)
    115 		{
    116 			if (mAGD->mLoopsAnimIDs.at(i) == mState)
    117 			{
    118 				mCurrentFrame = mAnimPack.ActivateAnimation(mAGD->mLoopsAnimIDs.at(i))->GetCurrentFrame();
    119 				return &mCurrentFrame;
    120 			}
    121 		}
    122 	}
    123 	return NULL;
    124 }
    125 
    126 Frame* AnimGraph::PlayOnce(int AnimID)
    127 {
    128 	mCurrentFrame = mAnimPack.ActivateAnimation(AnimID, ONCE)->GetCurrentFrame();
    129 	return &mCurrentFrame;
    130 }
    131 
    132 bool AnimGraph::EventProcess(Event eve)
    133 {
    134 	switch (*eve.GetEventType())
    135 	{
    136 	case ANIM_COMPLETE:
    137 		mState = *mActorState;
    138 		mFeed.EventProcess(Event(ANIM_COMPLETE, eve.GetEventData()->i));
    139 		return true;
    140 	default:
    141 		gCons->ConsPrintf("Animation Graph asked to process unrecgonized event\n");
    142 		return false;
    143 	}
    144 }