diff options
Diffstat (limited to 'source/logic/Game.cpp')
-rw-r--r-- | source/logic/Game.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/source/logic/Game.cpp b/source/logic/Game.cpp new file mode 100644 index 0000000..57abd79 --- /dev/null +++ b/source/logic/Game.cpp @@ -0,0 +1,185 @@ +#include "Game.h" + +Game::Game() + :_config("config.txt"), + _screen(_config.screenWidth(), _config.screenHeight(), _config.fullscreen()) +{ + _timer = al_create_timer(1.0/FPS); + _timerEvents = al_create_event_queue(); + al_register_event_source(_timerEvents, al_get_timer_event_source(_timer)); +} + +Game::~Game() +{ + al_destroy_event_queue(_timerEvents); + al_destroy_timer(_timer); + +} + +void Game::start() +{ + while (!_screen.exitClicked()) + { + string filename = _screen.getLevel(); + if (!filename.empty()) + { + initLevel(filename); + runloop(); + } + } +} + +void Game::initLevel(const string& levelFile) +{ + clearLists(); + LevelReader reader(levelFile); + reader.readLevel(_maze, _players, _enemies, _checkpoints, _rocks); +} + +void Game::runloop() +{ + bool gameWon = false; + bool gameLost = false; + al_start_timer(_timer); + + while (!_screen.exitClicked()) + { + al_wait_for_event(_timerEvents, NULL); + al_flush_event_queue(_timerEvents); + + update(); + _collisionDetector.checkCollisions(_players, _enemies, _checkpoints, _rocks, _smokescreens); + cleanup(); + _screen.draw(_maze, _players, _enemies, _checkpoints, _rocks, _smokescreens, _popups); + + gameLost = _players.empty(); + gameWon = Checkpoint::checkpointCount()==0; + + if (gameLost) + { + _screen.drawLoss(); + for (int i=0; i<90; i++) + { + al_wait_for_event(_timerEvents, NULL); + al_drop_next_event(_timerEvents); + } + break; + } + else if (gameWon) + { + _screen.drawWin(); + for (int i=0; i<90; i++) + { + al_wait_for_event(_timerEvents, NULL); + al_drop_next_event(_timerEvents); + } + break; + } + } + al_stop_timer(_timer); +} + +void Game::update() +{ + for (list<PlayerCar>::iterator iter = _players.begin(); iter!=_players.end(); ++iter) + { + iter->update(_maze, _smokescreens); + } + + for (list<EnemyCar>::iterator iter = _enemies.begin(); iter!=_enemies.end(); ++iter) + { + iter->update(_maze, _players, _rocks); + } + + for (list<Smokescreen>::iterator iter = _smokescreens.begin(); iter!=_smokescreens.end(); ++iter) + { + iter->update(); + } + for (list<DestroyedObjectPopup>::iterator iter = _popups.begin(); iter!=_popups.end(); ++iter) + { + iter->update(); + } +} + +void Game::cleanup() +{ + for (list<PlayerCar>::iterator iter = _players.begin(); iter!=_players.end();) + { + if (iter->destroyed()) + { + _popups.push_back(DestroyedObjectPopup(iter->x(), iter->y(), BitmapStore::CRASHED_CAR)); + iter = _players.erase(iter); + } + else + { + ++iter; + } + } + for (list<EnemyCar>::iterator iter = _enemies.begin(); iter!=_enemies.end();) + { + if (iter->destroyed()) + { + _popups.push_back(DestroyedObjectPopup(iter->x(), iter->y(), BitmapStore::CRASHED_CAR)); + iter = _enemies.erase(iter); + } + else + { + ++iter; + } + } + for (list<Checkpoint>::iterator iter = _checkpoints.begin(); iter!=_checkpoints.end();) + { + if (iter->destroyed()) + { + _popups.push_back(DestroyedObjectPopup(iter->x(), iter->y(), BitmapStore::CLAIMED_CHECKPOINT)); + iter = _checkpoints.erase(iter); + } + else + { + ++iter; + } + } + for (list<Rock>::iterator iter = _rocks.begin(); iter!=_rocks.end();) + { + if (iter->destroyed()) + { + iter = _rocks.erase(iter); + } + else + { + ++iter; + } + } + for (list<Smokescreen>::iterator iter = _smokescreens.begin(); iter!=_smokescreens.end();) + { + if (iter->destroyed()) + { + iter = _smokescreens.erase(iter); + } + else + { + ++iter; + } + } + for (list<DestroyedObjectPopup>::iterator iter = _popups.begin(); iter!=_popups.end();) + { + if (iter->destroyed()) + { + iter = _popups.erase(iter); + } + else + { + ++iter; + } + } +} + +void Game::clearLists() +{ + _players.clear(); + _enemies.clear(); + _checkpoints.clear(); + _rocks.clear(); + _smokescreens.clear(); + _popups.clear(); +} |