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);
		}
	}
}
Exemple #3
0
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;
	}
}
Exemple #4
0
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;
	}
}
Exemple #9
0
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);
		}
	}
}