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 98 99 100 101 102 103 104 105
|
#include "World.h"
World::~World() {
int numObjects = mObjects.size();
for( int i=0; i<numObjects; i++ ) {
delete *( mObjects.getElement( i ) );
}
}
void World::add( GameObject *inObject ) {
mObjects.push_back( inObject );
}
void World::remove( GameObject *inObject ) {
mObjects.deleteElementEqualTo( inObject );
}
double numBlocksOnScreen = 10;
void World::draw( double inScreenCenterX ) {
int numObjects = mObjects.size();
//printf( "Drawing %d objects\n", numObjects );
int i;
// search for deepest layer
int thisDepthLayer = 0;
for( i=0; i<numObjects; i++ ) {
GameObject *o = *( mObjects.getElement( i ) );
if( o->mDepthLayer > thisDepthLayer ) {
thisDepthLayer = o->mDepthLayer;
}
}
int nextDepthLayer = thisDepthLayer;
thisDepthLayer += 1;
// found with profiler
// Construct one vector outside of loop
Vector3D screenPos( 0, 0, 0 );
while( nextDepthLayer != thisDepthLayer ) {
thisDepthLayer = nextDepthLayer;
for( i=0; i<numObjects; i++ ) {
GameObject *o = *( mObjects.getElement( i ) );
if( o->mDepthLayer == thisDepthLayer ) {
// translate into screen coords
screenPos.mX = ( o->mX - inScreenCenterX ) / numBlocksOnScreen;
screenPos.mY = o->mY / numBlocksOnScreen
+ (0.5 / numBlocksOnScreen)
- 0.5;
double scale = o->mScale / numBlocksOnScreen;
//printf( "Drawing sprite at %f,%f, %f\n", x, y, scale );
o->draw( o->mRotation, &screenPos,
scale,
o->mFadeFactor,
&( o->mColor ) );
}
else if( o->mDepthLayer < thisDepthLayer ) {
if( nextDepthLayer == thisDepthLayer ) {
nextDepthLayer = o->mDepthLayer;
}
else if( o->mDepthLayer > nextDepthLayer ) {
nextDepthLayer = o->mDepthLayer;
}
}
}
}
}
void World::step() {
int numObjects = mObjects.size();
for( int i=0; i<numObjects; i++ ) {
GameObject *o = *( mObjects.getElement( i ) );
if( o->mEnableSteps ) {
o->mainStep();
}
}
}
|