gpt4 book ai didi

C++ 实现状态

转载 作者:行者123 更新时间:2023-11-28 05:08:07 25 4
gpt4 key购买 nike

我的问题是:我正在尝试在我的项目中实现基本状态管理,但我坚持改变状态。我的所有状态都在 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(在我的例子中是应用程序类)

最佳答案

好吧,我猜这是为了游戏(但不一定是)。我没有像您那样在状态之间切换,而是使用枚举。

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

如果不是,那一定是我误会了(抱歉)。

关于C++ 实现状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44165692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com