void StateManager::popState(const std::string &n) { if (canChangeState() && !states.empty()) { if (stateObjects[(*(states.top())).name]) stateObjects[(*(states.top())).name]->removeState(); //states.top()->eraseRenderObjects(); std::string n = (*(states.top())).name; removeState(n); delete states.top(); if (core->getNestedMains()==1) core->clearGarbage(); // HACK: Fugly, fugly code for (int i = 0; i < 2; i++) { std::stack<StateData*>copy; copy = states; while (!states.empty()) states.pop(); while (!copy.empty()) { if (copy.top()->name != n) states.push(copy.top()); copy.pop(); } } stateChangeFlag = true; } }
void StateManager::onUpdate(float dt) { std::stack<StateData*>copy; copy = states; while (!copy.empty()) { if (stateObjects[copy.top()->name]) stateObjects[copy.top()->name]->update(dt); copy.pop(); } if (canChangeState() && !enqueuedJumpState.empty()) { if (enqueuedStateStage == 0) { enqueuedStateStage = -1; popAllStates(); } else if (enqueuedStateStage == -1) { std::string copy = enqueuedJumpState; enqueuedJumpState = ""; jumpState(copy); } } }
void StateManager::pushState(const std::string &s) { std::string state = s; stringToLower(state); if (canChangeState()) { if (states_full()) { debugLog("state stack overflow!!"); return; } StateData *s = new StateData; s->name = state; states[++statesTopIndex] = s; applyState(state); if (stateObjects[state]) { s->stateObject = stateObjects[state]; stateObjects[state]->applyState(); } stateChangeFlag = true; } }
void StateManager::jumpState (const std::string &state) { if (canChangeState()) { popAllStates(); pushState(state); } }
void StateManager::jumpState (const std::string &state) { if (canChangeState()) { while (!states.empty()) { popState (); } pushState (state); } }
/* enqueueJumpState force will force the state change regardless of the result of canChangeState() staged = if true, the manager will pop all the states and allow the system to clear garbage before pushing the new state */ void StateManager::enqueueJumpState (const std::string &state, bool force, bool staged) { if (force || canChangeState()) { enqueuedJumpState = state; if (staged) { enqueuedStateStage = 0; } else { enqueuedStateStage = -1; } } }
void StateManager::popState() { if (canChangeState() && !states.empty()) { if (stateObjects[(*(states.top())).name]) stateObjects[(*(states.top())).name]->removeState(); //states.top()->eraseRenderObjects(); std::string n = (*(states.top())).name; removeState(n); delete states.top(); if (core->getNestedMains()==1) core->clearGarbage(); states.pop(); stateChangeFlag = true; } }
void StateManager::pushState(const std::string &s) { std::string state = s; stringToLower(state); if (canChangeState()) { StateData *s = new StateData; s->name = state; states.push (s); applyState(state); if (stateObjects[state]) { s->stateObject = stateObjects[state]; stateObjects[state]->applyState(); } stateChangeFlag = true; } }
void StateManager::onUpdate(float dt) { for (int i = 0; i <= statesTopIndex; i++) { StateObject *obj = stateObjects[states[i]->name]; if (obj) obj->update(dt); } if (canChangeState() && !enqueuedJumpState.empty()) { if (enqueuedStateStage == 0) { enqueuedStateStage = -1; popAllStates(); } else if (enqueuedStateStage == -1) { std::string copy = enqueuedJumpState; enqueuedJumpState = ""; jumpState(copy); } } }