GameStateManager.cpp
Go to the documentation of this file.00001 //*** GameStateManager.cpp *** 00002 00003 #include "GameStateManager.h" 00004 #include "Debug.h" 00005 #include "Asset.h" 00006 #include "GameState.h" 00007 #include "ColorHelper.h" 00008 #include "HashTableIterator.h" 00009 00010 00011 //*** Constructor *** 00012 00013 GameStateManager::GameStateManager(): 00014 state_("STATE_NOT_SET"), 00015 stateInstance_(0), 00016 transitioningOut_(false), 00017 transitioningIn_(false), 00018 transitionInTime_(0), 00019 transitionInTimeElapsed_(0), 00020 transitionOutTime_(0), 00021 transitionOutTimeElapsed_(0), 00022 newTransitionInTime_(0), 00023 exitRequested_(false), 00024 exitFlag_(false) 00025 { 00026 } 00027 00028 00029 //*** Destructor *** 00030 00031 GameStateManager::~GameStateManager() 00032 { 00033 ExitCurrentState(); 00034 } 00035 00036 00037 //*** SetState *** 00038 00039 void GameStateManager::SetState(StringId newState) 00040 { 00041 // Leave current state 00042 if (stateInstance_) 00043 { 00044 delete stateInstance_; 00045 stateInstance_=0; 00046 state_=StringId(0); 00047 } 00048 00049 // If there's no new state, we're done 00050 if (newState.GetString()==0) 00051 { 00052 return; 00053 } 00054 00055 00056 // Change current state 00057 typedef GameState* (*CreateFunction)(); 00058 HashTableIterator<HashTableKey_StringId,CreateFunction> it(gameStates_); 00059 CreateFunction createFunction=0; 00060 if (it.Find(HashTableKey_StringId(newState))) 00061 { 00062 createFunction=it.GetCurrent(); 00063 } 00064 Assert(createFunction,"State not recognized!"); 00065 if (!createFunction) 00066 { 00067 return; 00068 } 00069 state_=newState; 00070 stateInstance_=createFunction(); 00071 } 00072 00073 00074 //*** GetState *** 00075 00076 StringId GameStateManager::GetState() 00077 { 00078 return state_; 00079 } 00080 00081 00082 //*** Update *** 00083 00084 void GameStateManager::Update(float deltaTime) 00085 { 00086 00087 // Update transition out 00088 if (transitioningOut_) 00089 { 00090 if (transitionOutTimeElapsed_>=transitionOutTime_) 00091 { 00092 transitioningOut_=false; 00093 } 00094 else 00095 { 00096 transitionOutTimeElapsed_+=deltaTime; 00097 if (transitionOutTimeElapsed_>=transitionOutTime_) 00098 { 00099 transitionOutTimeElapsed_=transitionOutTime_; 00100 } 00101 } 00102 } 00103 00104 // Update transition in 00105 if (transitioningIn_) 00106 { 00107 if (transitionInTimeElapsed_>=transitionInTime_) 00108 { 00109 transitioningIn_=false; 00110 } 00111 else 00112 { 00113 transitionInTimeElapsed_+=deltaTime; 00114 if (transitionInTimeElapsed_>=transitionInTime_) 00115 { 00116 transitionInTimeElapsed_=transitionInTime_; 00117 } 00118 } 00119 } 00120 00121 // Handle exit requests 00122 if (exitRequested_ && !transitioningOut_ && !transitioningIn_) 00123 { 00124 ExitCurrentState(); 00125 exitFlag_=true; 00126 return; 00127 } 00128 00129 // Perfrom state switch, if requested 00130 static StringId empty; 00131 if (stateToSwitchTo_!=empty) 00132 { 00133 if (!transitioningOut_ && !transitioningIn_) 00134 { 00135 StringId newState=stateToSwitchTo_; 00136 stateToSwitchTo_=empty; 00137 SetState(newState); 00138 if (newTransitionInTime_>0) 00139 { 00140 transitionInTime_=newTransitionInTime_; 00141 transitionInTimeElapsed_=0; 00142 transitioningIn_=true; 00143 } 00144 } 00145 } 00146 00147 // Update state instance 00148 if (stateInstance_) 00149 { 00150 stateInstance_->Update(deltaTime); 00151 } 00152 00153 } 00154 00155 00156 //*** RegisterGameState *** 00157 00158 void GameStateManager::RegisterGameState(StringId id, CreateFunction createFunction) 00159 { 00160 HashTableIterator<HashTableKey_StringId,CreateFunction> it(gameStates_); 00161 if (!it.Find(HashTableKey_StringId(id))) 00162 { 00163 gameStates_.Insert(HashTableKey_StringId(id),createFunction); 00164 } 00165 else 00166 { 00167 Assert(false,"State already registered!"); 00168 } 00169 } 00170 00171 00172 //*** SwitchState *** 00173 00174 void GameStateManager::SwitchState(StringId state, float transitionOutTime, float transitionInTime) 00175 { 00176 stateToSwitchTo_=state; 00177 00178 newTransitionInTime_=transitionInTime; 00179 00180 if (!transitioningOut_ && transitionOutTime>0) 00181 { 00182 transitioningOut_=true; 00183 transitionOutTime_=transitionOutTime; 00184 transitionOutTimeElapsed_=0; 00185 if (transitioningIn_) 00186 { 00187 transitioningIn_=false; 00188 transitionOutTimeElapsed_=(transitionInTime_-transitionInTimeElapsed_); 00189 } 00190 } 00191 00192 } 00193 00194 00195 //*** ExitCurrentState *** 00196 00197 void GameStateManager::ExitCurrentState() 00198 { 00199 if (stateInstance_) 00200 { 00201 delete stateInstance_; 00202 stateInstance_=0; 00203 state_=StringId(0); 00204 } 00205 } 00206 00207 00208 //*** IsTransitioning *** 00209 00210 bool GameStateManager::IsTransitioning() 00211 { 00212 return transitioningIn_ || transitioningOut_; 00213 } 00214 00215 00216 //*** IsTransitioningOut *** 00217 00218 bool GameStateManager::IsTransitioningOut() 00219 { 00220 return !transitioningIn_ && transitioningOut_; 00221 } 00222 00223 00224 //*** IsTransitioningIn *** 00225 00226 bool GameStateManager::IsTransitioningIn() 00227 { 00228 return transitioningIn_ && !transitioningOut_; 00229 } 00230 00231 00232 //*** GetTransitionValue *** 00233 00234 float GameStateManager::GetTransitionValue() 00235 { 00236 if (IsTransitioningIn()) 00237 { 00238 return transitionInTimeElapsed_/transitionInTime_; 00239 } 00240 else if (IsTransitioningOut()) 00241 { 00242 return transitionOutTimeElapsed_/transitionOutTime_; 00243 } 00244 else 00245 { 00246 return 0; 00247 } 00248 } 00249 00250 00251 //*** ExitApplication *** 00252 00253 void GameStateManager::ExitApplication() 00254 { 00255 exitRequested_=true; 00256 } 00257 00258 00259 //*** IsExitFlagSet *** 00260 00261 bool GameStateManager::IsExitFlagSet() 00262 { 00263 return exitFlag_; 00264 }
Reproduction/republishing of any material on this site without permission is strictly prohibited.
