Rally X
ELEN3009 Project by Justin Wernick and David Schneider
|
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 }