状态机状态之间的通信
Communication between state machine states
我在应用程序中磕磕绊绊地实现了状态机。
所以我有我的状态机:
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 类要更新状态机,它们都需要知道状态机。
最好的方法是在游戏和菜单类中保留对状态机的引用,以更新当前状态。您可以将其进一步封装在两个实现的接口中,以使事情更加清晰。
// 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);
}
// ...
};
通常,您尽量避免双向耦合。这是在 Menu 类中引用状态机。
但是,有多种方法可以解决此问题。
C++习语是带有虚拟函数的接口,您的 StateMachine 实现该接口,然后在菜单和游戏构造函数中传递this
。这减少了耦合,但也有其他缺点,例如它将处理限制在单个对象上。
但你也可以使用简单的函数指针(回调)、事件、信号等。
相关文章:
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- C++ 两台不同机器之间通过wifi进行套接字通信
- 线程之间的通信不起作用 - C++
- 通过USB在PC和Arduino之间进行串行通信
- 管理器类和对象类之间的通信
- 使用命名管道在 C# 和C++应用程序之间进行持续通信
- Python 3 套接字和 QTcpsocket (c++) 之间的通信失败
- 如何在嵌入式浏览器和Webside之间进行双向通信
- C++程序和未识别程序之间的双向通信
- 使用C++在同一系统上运行的 2 个服务之间进行通信
- C# 和C++应用程序之间的通信
- 如何在Qt WebChannel中以独立于平台的方式在HTML/Javascript和C++之间进行通信?
- 如何在 gtk+ c 中的回调之间进行通信
- Electron应用程序和Win32本机桌面应用程序之间的进程间通信
- 如何在线程之间进行通信和等效的waitforsingleobject()
- C++ 和 Simulink 之间通过 UDP 进行通信
- 在两个Windows QT5之间进行通信
- 覆盆子Pi(QT C )和Arduino(Arduino IDE)之间的通信
- Shell扩展窗口:最好的通信之间的ContextMenu和IconOverlay