summaryrefslogtreecommitdiff
path: root/source/logic/Game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/logic/Game.cpp')
-rw-r--r--source/logic/Game.cpp185
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();
+}