Ma question est: J'essaie de mettre en œuvre la gestion de l'état de base dans mon projet et je suis bloqué au changement d'état. J'ai tous mes états dans std::stack<State*>
conteneur, et les pousser/pop directement à partir de la classe Application ou de la classe State. Problème lorsque je change l'état actuel de la classe d'état, il peut être détruit avant l'appel de la méthode de rendu, ce qui entraîne une exception. Alors, comment puis-je éviter cela? PS désolé pour mon anglais et s'il vous plaît me dire si quelque chose dans mon problème/code ISN clairC++ Etats d'implémentation
classe Application:
void Application::pushState(State* state)
{
this->m_states.push(state);
this->m_states.top()->open();//enter state
}
void Application::popState()
{
if (!this->m_states.empty())
{
this->m_states.top()->close();//leave state
delete this->m_states.top();
}
if (!this->m_states.empty())
this->m_states.pop();
}
void Application::changeState(State* state)
{
if (!this->m_states.empty())
popState();
pushState(state);
}
State* Application::peekState()
{
if (this->m_states.empty()) return nullptr;
return this->m_states.top();
}
void Application::mainLoop()
{
sf::Clock clock;
while (this->m_window.isOpen())
{
sf::Time elapsed = clock.restart();
float delta = elapsed.asSeconds();
if (this->peekState() == nullptr)
this->m_window.close();
this->peekState()->update(delta)//if i change state in State.update(), it may be that code below will now point to not existing state
if (this->peekState() == nullptr)
this->m_window.close();
this->peekState()->render(delta);
}
}
classe État:
void EditorState::update(const float delta)
{
sf::Event event;
while (this->m_application->m_window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
this->m_application->popState();
return;
}
}
}
Ok cela est peut-être pas vraiment une problème, mais quelque chose comme "comment" question. Comme vous pouvez le voir dans mon code, je mets à jour et restitue les états dans la méthode mainLoop(). Ce qu'il faut savoir, c'est comment gérer ces mises à jour, en supposant que cet état peut être changé de l'état lui-même, et pas seulement de stateManager (dans mon cas Application class)
Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –
Etes-vous sûr qu'une pile est la bonne structure de données pour contenir des états? Vous pourriez être intéressé par [this] (http://makulik.github.io/sttcl/). –
Pas sûr, peut-être je peux le changer en vecteur, mais dans l'ensemble ce n'est pas ce que mon problème est que je pense – joe503