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
|
#include "GridTransition.h"
GridTransition::GridTransition( BlockGrid *inA, BlockGrid *inB, World *inWorld,
int inNumTransitionSteps )
: mWorld( inWorld ),
mFirstBlendedBlock( NULL ) {
SimpleVector<Block *> *blocksA = inA->getAllBlocks();
SimpleVector<Block *> *blocksB = inB->getAllBlocks();
int indexA = 0;
int indexB = 0;
char doneA = false;
char doneB = false;
while( !( doneA && doneB ) ) {
if( indexA == blocksA->size() ) {
doneA = true;
indexA = 0;
}
if( indexB == blocksB->size() ) {
doneB = true;
indexB = 0;
}
if( !( doneA && doneB ) ) {
Block *blockA = NULL;
Block *blockB = NULL;
if( indexA < blocksA->size() ) {
blockA = *( blocksA->getElement( indexA ) );
indexA ++;
}
if( indexB < blocksB->size() ) {
blockB = *( blocksB->getElement( indexB ) );
indexB ++;
}
if( blockA != NULL || blockB != NULL ) {
BlendedBlock * blockBlend =
new BlendedBlock( blockA, blockB,
inNumTransitionSteps );
if( mFirstBlendedBlock == NULL ) {
mFirstBlendedBlock = blockBlend;
}
mWorld->add( blockBlend );
mBlocks.push_back( blockBlend );
}
}
}
if( blocksA->size() == 0 && blocksB->size() == 0 ) {
// empty to empty transition
// one dummy block
mFirstBlendedBlock = new BlendedBlock( NULL, NULL,
inNumTransitionSteps );
mWorld->add( mFirstBlendedBlock );
mBlocks.push_back( mFirstBlendedBlock );
}
delete blocksA;
delete blocksB;
}
GridTransition::~GridTransition() {
for( int i=0; i<mBlocks.size(); i++ ) {
BlendedBlock *block = *( mBlocks.getElement( i ) );
mWorld->remove( block );
delete block;
}
}
char GridTransition::isDone() {
if( mFirstBlendedBlock == NULL ) {
return true;
}
else {
return mFirstBlendedBlock->isDone();
}
}
|