Rally X
ELEN3009 Project by Justin Wernick and David Schneider
source/logic/Game.cpp
Go to the documentation of this file.
00001 #include "Game.h"
00002 
00003 Game::Game()
00004     :_config("config.txt"),
00005     _screen(_config.screenWidth(), _config.screenHeight(), _config.fullscreen())
00006 {
00007     _timer  = al_create_timer(1.0/FPS);
00008     _timerEvents = al_create_event_queue();
00009     al_register_event_source(_timerEvents, al_get_timer_event_source(_timer));
00010 }
00011 
00012 Game::~Game()
00013 {
00014     al_destroy_event_queue(_timerEvents);
00015     al_destroy_timer(_timer);
00016 
00017 }
00018 
00019 void Game::start()
00020 {
00021     while (!_screen.exitClicked())
00022     {
00023         string filename = _screen.getLevel();
00024         if (!filename.empty())
00025         {
00026             initLevel(filename);
00027             runloop();
00028         }
00029     }
00030 }
00031 
00032 void Game::initLevel(const string& levelFile)
00033 {
00034     clearLists();
00035     LevelReader reader(levelFile);
00036     reader.readLevel(_maze, _players, _enemies, _checkpoints, _rocks);
00037 }
00038 
00039 void Game::runloop()
00040 {
00041     bool gameWon = false;
00042     bool gameLost = false;
00043     al_start_timer(_timer);
00044 
00045     while (!_screen.exitClicked())
00046     {
00047         al_wait_for_event(_timerEvents, NULL);
00048         al_flush_event_queue(_timerEvents);
00049 
00050         update();
00051         _collisionDetector.checkCollisions(_players, _enemies, _checkpoints, _rocks, _smokescreens);
00052         cleanup();
00053         _screen.draw(_maze, _players, _enemies, _checkpoints, _rocks, _smokescreens, _popups);
00054 
00055         gameLost = _players.empty();
00056         gameWon = Checkpoint::checkpointCount()==0;
00057 
00058         if (gameLost)
00059         {
00060             _screen.drawLoss();
00061             for (int i=0; i<90; i++)
00062             {
00063                 al_wait_for_event(_timerEvents, NULL);
00064                 al_drop_next_event(_timerEvents);
00065             }
00066             break;
00067         }
00068         else if (gameWon)
00069         {
00070             _screen.drawWin();
00071             for (int i=0; i<90; i++)
00072             {
00073                 al_wait_for_event(_timerEvents, NULL);
00074                 al_drop_next_event(_timerEvents);
00075             }
00076             break;
00077         }
00078     }
00079     al_stop_timer(_timer);
00080 }
00081 
00082 void Game::update()
00083 {
00084     for (list<PlayerCar>::iterator iter = _players.begin(); iter!=_players.end(); ++iter)
00085     {
00086         iter->update(_maze, _smokescreens);
00087     }
00088 
00089     for (list<EnemyCar>::iterator iter = _enemies.begin(); iter!=_enemies.end(); ++iter)
00090     {
00091         iter->update(_maze, _players, _rocks);
00092     }
00093 
00094     for (list<Smokescreen>::iterator iter = _smokescreens.begin(); iter!=_smokescreens.end(); ++iter)
00095     {
00096         iter->update();
00097     }
00098     for (list<DestroyedObjectPopup>::iterator iter = _popups.begin(); iter!=_popups.end(); ++iter)
00099     {
00100         iter->update();
00101     }
00102 }
00103 
00104 void Game::cleanup()
00105 {
00106     for (list<PlayerCar>::iterator iter = _players.begin(); iter!=_players.end();)
00107     {
00108         if (iter->destroyed())
00109         {
00110             _popups.push_back(DestroyedObjectPopup(iter->x(), iter->y(), BitmapStore::CRASHED_CAR));
00111             iter = _players.erase(iter);
00112         }
00113         else
00114         {
00115             ++iter;
00116         }
00117     }
00118     for (list<EnemyCar>::iterator iter = _enemies.begin(); iter!=_enemies.end();)
00119     {
00120         if (iter->destroyed())
00121         {
00122             _popups.push_back(DestroyedObjectPopup(iter->x(), iter->y(), BitmapStore::CRASHED_CAR));
00123             iter = _enemies.erase(iter);
00124         }
00125         else
00126         {
00127             ++iter;
00128         }
00129     }
00130     for (list<Checkpoint>::iterator iter = _checkpoints.begin(); iter!=_checkpoints.end();)
00131     {
00132         if (iter->destroyed())
00133         {
00134             _popups.push_back(DestroyedObjectPopup(iter->x(), iter->y(), BitmapStore::CLAIMED_CHECKPOINT));
00135             iter = _checkpoints.erase(iter);
00136         }
00137         else
00138         {
00139             ++iter;
00140         }
00141     }
00142     for (list<Rock>::iterator iter = _rocks.begin(); iter!=_rocks.end();)
00143     {
00144         if (iter->destroyed())
00145         {
00146             iter = _rocks.erase(iter);
00147         }
00148         else
00149         {
00150             ++iter;
00151         }
00152     }
00153     for (list<Smokescreen>::iterator iter = _smokescreens.begin(); iter!=_smokescreens.end();)
00154     {
00155         if (iter->destroyed())
00156         {
00157             iter = _smokescreens.erase(iter);
00158         }
00159         else
00160         {
00161             ++iter;
00162         }
00163     }
00164     for (list<DestroyedObjectPopup>::iterator iter = _popups.begin(); iter!=_popups.end();)
00165     {
00166         if (iter->destroyed())
00167         {
00168             iter = _popups.erase(iter);
00169         }
00170         else
00171         {
00172             ++iter;
00173         }
00174     }
00175 }
00176 
00177 void Game::clearLists()
00178 {
00179     _players.clear();
00180     _enemies.clear();
00181     _checkpoints.clear();
00182     _rocks.clear();
00183     _smokescreens.clear();
00184     _popups.clear();
00185 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator