X-Git-Url: http://gitweb.pgornicz.com/gitweb.cgi?a=blobdiff_plain;f=src%2Fgame.cpp;h=000bdf4ccc9498d25d7175f5cbd4823ea4c4a3d0;hb=5e0713e5967be038b1b0cc5f0ffbd0180e3f7099;hp=95cd04daaf97d25f537540a901154c8277fc9698;hpb=e68f847b245153427266841ae724d602ca434c29;p=physics.git diff --git a/src/game.cpp b/src/game.cpp index 95cd04d..000bdf4 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -16,7 +16,9 @@ */ #include "game.h" -#include "debug.h" + +#include +using namespace bear; #include using std::vector; @@ -33,84 +35,121 @@ using std::vector; /// ***** Private Variables ***** // The stack of active game states -vector active_States; +static vector s_active_States; // Pointers to each possible game state -// inserted and removed from the active_States -Running* running; -Paused* paused; -CreatingPolygon* creating_Polygon; +// inserted and removed from the s_active_States +static vector s_possible_States; + +// true if the top state requested itself to be poped +static bool s_bPopState; +// pointer to a state wishing to be added +static GameState* s_pPushState; /// ***** Public Methods ***** void game::init() { - running = new Running(); - paused = new Paused(); - creating_Polygon = new CreatingPolygon(); + s_bPopState = false; + s_pPushState = NULL; // create starting entities creator::init(); + effect::init(); - active_States.push_back(running); + Running* pRunning = new Running(); + s_possible_States.push_back(pRunning); + s_possible_States.push_back(new Paused()); + s_possible_States.push_back(new CreatingPolygon()); - effect::init(); + s_active_States.push_back(pRunning); -#ifdef DEBUGGING - cout << "World Created" << endl; -#endif + DPF(0, "World Created"); } void game::clean() { effect::clean(); - creator::clean(); - delete creating_Polygon; - delete paused; - delete running; + for(unsigned int i=0; i < s_possible_States.size(); i++) + { + delete s_possible_States[i]; + } + s_possible_States.clear(); + s_active_States.clear(); } -void game::input() +void game::handleInput() { - int last = active_States.size() -1; + creator::handleInput(); + + int iLast = s_active_States.size() -1; + + for(unsigned int i=0; i < s_possible_States.size(); i++) + { + GameState* pState = s_possible_States[i]; + + if(s_active_States[iLast] != pState && pState->pushMe()) + { + s_pPushState = pState; + } + } + + for( int i = 0; - i <= last; + i <= iLast; i++ ) { - if( i == last ) - active_States[i]->handleInput(true); + if( i == iLast ) + { + if(s_active_States[i]->popMe()) + s_bPopState = true; + else + s_active_States[i]->handleInput(true); + } else - active_States[i]->handleInput(false); + s_active_States[i]->handleInput(false); } } -void game::update(float time_step) +void game::update(float fTimeStep) { - int last = active_States.size() -1; + if(s_bPopState) + { + s_active_States.pop_back(); + s_bPopState = false; + } + + if(s_pPushState != NULL) + { + s_active_States.push_back(s_pPushState); + s_pPushState = NULL; + } + + int iLast = s_active_States.size() -1; for( int i = 0; - i <= last; + i <= iLast; i++ ) { - if( i == last ) - active_States[i]->update(time_step, true); + if( i == iLast ) + s_active_States[i]->update(fTimeStep, true); else - active_States[i]->update(time_step, false); + s_active_States[i]->update(fTimeStep, false); } } void game::draw() { - int last = active_States.size() -1; + int iLast = s_active_States.size() -1; for( int i = 0; - i <= last; + i <= iLast; i++ ) { - if( i == last ) - active_States[i]->draw(true); + if( i == iLast ) + s_active_States[i]->draw(true); else - active_States[i]->draw(false); + s_active_States[i]->draw(false); } }