C:/Documents and Settings/mtauraso/Desktop/proj3/projectX/CollisionHandler.cpp

Go to the documentation of this file.
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 }

Generated on Sat Apr 22 15:05:20 2006 for ProjectX by  doxygen 1.4.6-NO