[英]C++ Implementing states
我的问题是:我正在尝试在项目中实施基本状态管理,而我却坚持更改状态。 我将所有状态存储在std::stack<State*>
容器中,并直接从Application类或State类推送/弹出它们。 问题是,当我从State类更改当前状态时,可以在调用render方法之前将其销毁,从而导致异常。 那么我该如何避免呢? PS对不起我的英语,如果我的问题/代码中的某些内容不清楚,请告诉我
应用类别:
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);
}
}
州级:
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;
}
}
}
好的,也许这并不是一个真正的问题,而是类似“如何”的问题。 如您在我的代码中看到的,我在mainLoop()方法中更新和呈现状态。 要弄清楚的是如何管理这些更新,假设状态可以从状态本身更改,而不仅仅是从stateManager(在我的情况下为Application类)更改。
好的,所以我猜测这是针对游戏的(但不一定如此)。 我使用枚举代替执行您在状态之间切换所要做的事情。
enum class GameState {
MENU, PLAY, PAUSE
}
然后,在您的主标题中
GameState m_gameState = GameState::MENU;
在主循环中,只需执行以下操作即可检查当前状态
if (m_gameState == GameState::MENU)
{
...
}
或者您可以使用switch语句
switch (m_gameState)
{
case GameState::MENU:
...
break;
case GameState::PLAY:
...
break;
case GameState::PAUSE:
...
break;
}
而且,如果您要切换状态,则只需执行
m_gameState = GameState::PAUSE;
希望这回答了您的问题:D
如果没有,我一定会误会(抱歉)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.