我从这里使用游戏状态管理器(介绍、主菜单、游戏玩法等)。然而有一个问题。一个非常简约的例子:
class cApp //manages the states and gives them access to window
{
public:
cApp (RenderWindow & ref) : window(ref) {}
void changeState(cState *); //these function realy doesn't matter
void update();
void draw();
RenderWindow & window; //the same as in the article, this class not only manages state but gives them access to window etc
private:
std::vector <cState *> states;
}
状态:
class cState
{
public:
cState(cApp * ptr) : app(ptr) {}
virtual void update() = 0;
virtual void draw() = 0;
protected:
cApp * app;
}
到目前为止一切都很好。问题是这是基本框架的一部分。所以 cApp 只是非常基本的,只允许访问窗口。然而,可能存在用户想要在他的游戏中使用网络的情况。网络引擎不是单一状态的一部分,因此它必须处于更全局的(即 cApp)级别。
所以用户这样做:
class cNetworkedApp : public cApp
{
public:
cNetworkedApp(RenderWindow & ref1, NetworkEngine & ref2)
: networking(ref2), cApp(ref1)
NetworkEngine & networking; //initialized in cNetworkedApp constructor
}
class CharacterCreationState : public cState
{
CharacterCreationState(cApp * ptr) : cState(ptr) {}
//implement pure virtual functions
void draw()
{}
void update()
{
//THE PROBLEM
//the state needs to access the network engine so casting is required
cNetworkedApp * ptr = static_cast<cNetworkedApp*>(app))
ptr->networking.sendSomething();
}
}
唯一明显的解决方案是在 cApp 中包含所有可能的内容,但是正如我所说,这是一个框架。当然,像物理引擎或声音引擎这样的引擎是你放入状态的东西,所以这不是问题,但是像网络系统这样的东西必须是所有状态都可用的一个对象。并不是每个应用程序都使用它。
我需要重新设计此代码还是可以?