gpt4 book ai didi

c++ - 状态机状态之间的通信

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:16 25 4
gpt4 key购买 nike

我在我的应用程序中实现状态机时遇到了一些问题。

所以我有我的状态机:

class StateMachine
{
public:
enum State { MENU, GAME };
StateMachine();
void Update();
void Render();

private:
Menu* mMenu;
Game* mGame;
State mState;
};

StateMachine::StateMachine()
{
mState = MENU;
}

void StateMachine::Update()
{
switch(mState)
{
case MENU:
mMenu -> Update(); break;
case GAME:
mGame -> Update(); break;
}
}
void StateMachine::Render()
{
switch(mState)
{
case MENU:
mMenu -> Render(); break;
case GAME:
mGame -> Render(); break;
}
}

我的菜单和游戏类封装了更新、渲染、键盘输入处理等。

所以我的问题是,如果状态在 MENU 中,我如何在对象 mMenu 与状态机之间进行通信以告诉它进入游戏状态?我是否需要在菜单和游戏中使用状态机选择的变量来切换状态?

最佳答案

如果 Menu 和 Game 类要更新它,它们都需要知道 StateMachine。

最好的方法是在更新当前状态的 Game 和 Menu 类中保持对状态机的引用。您可以将其进一步封装在一个接口(interface)中,两者都实现以使事情更加清晰。

// State.hpp
class State {
public:
virtual Handle() = 0;
};

// Cotext.hpp
#include "State.hpp"

class Context {
private:
State* currentState;

public:
void Update() {
currentState->handle():
}

void setState(State* state) {
currentState = state;
}
};

class ContextSwitcher {
virtual void SetContext(Context* context) = 0;
};

// Game.hpp
#include "Context.hpp"

class Game : public State, ContextSwitcher {
Context* context_;
State* menu_;

public:
virtual void SetContext(Context* context) {
context_ = context;
}

virtual void SetMenu(State* menu) {
menu_ = menu;
}

virtual void Handle() {
// Do update stuff
if (shouldGoToMenu) {
context_->setState(menu_);
}
}
}

// Menu.hpp
class Menu : public State, ContextSwitcher {
Context* context_;
State* game_;

public:
virtual void SetContext(Context* context) {
context_ = context;
}

void SetGame(State* game) {
game_ = game;
}

virtual void Handle() {
// Do update stuff
if (shouldGoToGame) {
context_->setState(game_);
}
}
}

// GameContext.hpp
#include "Context.hpp"
#include "Menu.hpp"
#include "Game.hpp"

class GameContext : public Context {
private:
Menu menu;
Game game;

public:
void Init() {
menu->SetContext(this);
menu->SetGame(&game);
game->SetContext(this);
game->SetMenu(&menu);

}
// ...
};

关于c++ - 状态机状态之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28219497/

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