00001 #include <iostream> 00002 00003 #include "Collisionhandler.h" 00004 #include "glfuncs.h" 00005 #include "Level.h" 00006 #include <cmath> 00007 00008 #include <vector> 00009 00010 00011 using namespace std; 00012 00013 CollisionHandler* CollisionHandler::_instance = NULL; 00014 00015 CollisionHandler::CollisionHandler() 00016 :_currentLevel( NULL ) 00017 { 00018 } 00019 00020 CollisionHandler* CollisionHandler::instance() 00021 { 00022 if( _instance == NULL ) 00023 _instance = new CollisionHandler(); 00024 return _instance; 00025 } 00026 00027 bool CollisionHandler::checkCollision( Object *o ) 00028 { 00029 bool collided = false; 00030 vector<Object *> objects = ObjsColliding(o); 00031 00032 for(vector< Object* >::iterator i = objects.begin(); i != objects.end(); i++ ) 00033 { 00034 o->collide( (*i) ); 00035 (*i)->collide( o ); 00036 00037 collided = true; 00038 } 00039 00040 return collided; 00041 } 00042 00043 std::vector<Object*> CollisionHandler::ObjsColliding( Object *o ) 00044 { 00045 vector<Object*> returnme; 00046 00047 Level* level = Level::instance(); 00048 if( level == NULL ) 00049 return returnme; 00050 00051 bool collided = false; 00052 vector< Object* >& objects = level->getObjects(); 00053 Tile* t; 00054 SDL_Rect box = o->getBox(); 00055 00056 for( int i = box.x / Level::tileWidth; i < ceil( (double)( box.x + box.w ) / Level::tileWidth ); i++ ) 00057 { 00058 for( int j = box.y / Level::tileHeight; j < ceil( (double)( box.y + box.h ) / Level::tileHeight ); j++ ) 00059 { 00060 t = level->getTile( i, j ); 00061 00062 if( t != NULL && o->collidable() && t->collidable()) 00063 { 00064 /*o->collide( t ); 00065 t->collide( o ); 00066 00067 collided = true;*/ 00068 returnme.push_back(t); 00069 } 00070 } 00071 } 00072 00073 for( vector< Object* >::iterator i = objects.begin(); i != objects.end(); i++ ) 00074 { 00075 // FIXME need some way to only call the collide function of the soonest collision 00076 if( o != (*i) && glfuncs::intersect( box, (*i)->getBox() ) && o->collidable() && (*i)->collidable()) 00077 { 00078 /*o->collide( (*i) ); 00079 (*i)->collide( o ); 00080 00081 collided = true;*/ 00082 returnme.push_back(*i); 00083 } 00084 } 00085 return returnme; 00086 }