Changeset 3243 for code/branches/core4/src/core/Game.cc
- Timestamp:
- Jun 28, 2009, 6:22:40 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/core4/src/core/Game.cc
r3238 r3243 54 54 using boost::weak_ptr; 55 55 56 std::map<std::string, GameState*> Game::allStates_s;57 Game* Game::singletonRef_s = 0;58 59 56 static void stop_game() 60 57 { Game::getInstance().stop(); } 61 58 SetConsoleCommandShortcutExternAlias(stop_game, "exit"); 62 // Add an empty gamestate that serves as internal root state63 AddGameState(GameState, "emptyRootGameState");64 59 65 60 struct _CoreExport GameStateTreeNode … … 69 64 std::vector<shared_ptr<GameStateTreeNode> > children_; 70 65 }; 66 67 std::map<std::string, Game::GameStateInfo> Game::gameStateDeclarations_s; 68 Game* Game::singletonRef_s = 0; 71 69 72 70 /** … … 76 74 Game::Game(int argc, char** argv) 77 75 { 78 assert(singletonRef_s == 0); 76 if (singletonRef_s != 0) 77 { 78 COUT(0) << "Error: The Game singleton cannot be recreated! Shutting down." << std::endl; 79 abort(); 80 } 79 81 singletonRef_s = this; 80 82 81 83 this->bAbort_ = false; 82 84 bChangingState_ = false; 83 // The empty root state is ALWAYS loaded! 84 this->rootStateNode_ = shared_ptr<GameStateTreeNode>(new GameStateTreeNode()); 85 this->rootStateNode_->state_ = getState("emptyRootGameState"); 86 this->activeStateNode_ = this->rootStateNode_; 87 this->activeStates_.push_back(this->rootStateNode_->state_); 85 86 // Create an empty root state 87 declareGameState<GameState>("GameState", "emptyRootGameState", true, false); 88 88 89 89 // reset statistics … … 98 98 this->gameClock_ = new Clock(); 99 99 100 // Create the Core 100 101 this->core_ = new orxonox::Core(); 101 102 this->core_->initialise(argc, argv); 102 103 104 // After the core has been created, we can safely instantiate the GameStates 105 for (std::map<std::string, GameStateInfo>::const_iterator it = gameStateDeclarations_s.begin(); 106 it != gameStateDeclarations_s.end(); ++it) 107 { 108 // Only create the states appropriate for the game mode 109 //if (GameMode::showsGraphics || !it->second.bGraphicsMode) 110 GameStateConstrParams params = { it->second.stateName, it->second.bIgnoreTickTime }; 111 gameStates_[getLowercase(it->second.stateName)] = GameStateFactory::fabricate(it->second.className, params); 112 } 113 114 // The empty root state is ALWAYS loaded! 115 this->rootStateNode_ = shared_ptr<GameStateTreeNode>(new GameStateTreeNode()); 116 this->rootStateNode_->state_ = getState("emptyRootGameState"); 117 this->activeStateNode_ = this->rootStateNode_; 118 this->activeStates_.push_back(this->rootStateNode_->state_); 119 120 // Do this after Core creation! 103 121 RegisterRootObject(Game); 104 122 this->setConfigValues(); … … 110 128 Game::~Game() 111 129 { 112 // Destroy pretty much everyhting left 130 // Destroy the GameStates (note that the nodes still point to them, but doesn't matter) 131 for (std::map<std::string, GameState*>::const_iterator it = gameStates_.begin(); 132 it != gameStates_.end(); ++it) 133 delete it->second; 134 135 // Destroy the Core and with it almost everything 113 136 delete this->core_; 114 115 137 delete this->gameClock_; 116 138 117 assert(singletonRef_s); 118 singletonRef_s = 0; 139 // Also, take care of the GameStateFactories 140 GameStateFactory::destroyFactories(); 141 142 // Don't assign singletonRef_s with NULL! Recreation is not supported 119 143 } 120 144 … … 165 189 166 190 // STATISTICS 167 statisticsTickInfo tickInfo = {currentTime, 0};191 StatisticsTickInfo tickInfo = {currentTime, 0}; 168 192 statisticsTickTimes_.push_back(tickInfo); 169 193 this->periodTime_ += this->gameClock_->getDeltaTimeMicroseconds(); … … 240 264 if (this->periodTime_ > statisticsRefreshCycle_) 241 265 { 242 std::list< statisticsTickInfo>::iterator it = this->statisticsTickTimes_.begin();266 std::list<StatisticsTickInfo>::iterator it = this->statisticsTickTimes_.begin(); 243 267 assert(it != this->statisticsTickTimes_.end()); 244 268 int64_t lastTime = currentTime - this->statisticsAvgLength_; … … 356 380 GameState* Game::getState(const std::string& name) 357 381 { 358 std::map<std::string, GameState*>::const_iterator it = allStates_s.find(getLowercase(name));359 if (it != allStates_s.end())382 std::map<std::string, GameState*>::const_iterator it = gameStates_.find(getLowercase(name)); 383 if (it != gameStates_.end()) 360 384 return it->second; 361 385 else … … 448 472 } 449 473 450 /*static*/ bool Game::addGameState(GameState* state) 451 { 452 std::map<std::string, GameState*>::const_iterator it = allStates_s.find(getLowercase(state->getName())); 453 if (it == allStates_s.end()) 454 allStates_s[getLowercase(state->getName())] = state; 455 else 456 ThrowException(GameState, "Cannot add two GameStates with the same name to 'Game'."); 457 458 // just a required dummy return value 459 return true; 460 } 461 462 /*static*/ void Game::destroyStates() 463 { 464 // Delete all GameStates created by the macros 465 for (std::map<std::string, GameState*>::const_iterator it = allStates_s.begin(); it != allStates_s.end(); ++it) 474 std::map<std::string, Game::GameStateFactory*> Game::GameStateFactory::factories_s; 475 476 /*static*/ GameState* Game::GameStateFactory::fabricate(const std::string& className, const GameStateConstrParams& params) 477 { 478 std::map<std::string, GameStateFactory*>::const_iterator it = factories_s.find(className); 479 assert(it != factories_s.end()); 480 return it->second->fabricate(params); 481 } 482 483 /*static*/ void Game::GameStateFactory::destroyFactories() 484 { 485 for (std::map<std::string, GameStateFactory*>::const_iterator it = factories_s.begin(); it != factories_s.end(); ++it) 466 486 delete it->second; 467 allStates_s.clear();487 factories_s.clear(); 468 488 } 469 489 }
Note: See TracChangeset
for help on using the changeset viewer.