现在说我有一个基类,我们称之为GameEngine
。 GameEngine
类继承了另一个类的几个函数。现在我有几个游戏状态,我需要将子类多态应用于这个问题:几个游戏状态都需要绘制游戏窗口的背景。关键是,我必须只有一个类来初始化我的游戏窗口。我的问题是,当我需要将游戏状态从一个更改为另一个时,我该怎么办?从本质上讲,我如何从我的超类中使用不同版本的子类函数(比如DrawBackground)?
代码:
BaseEngine *gameEngine;
gameEngine = new MenuState(this);
iResult = gameEngine->Initialise(...); // To initialise the window
// I need to find a way to transfer my state from Menu to Play after the window is initialised
iResult = gameEngine->MainLoop(); // To refresh the window (in case of background changed)
gameEngine->Deinitialise();
所以在上面的代码中,我有一个BaseEngine
可以做几个函数(在窗口中绘制一些东西)。我现在有两种游戏状态,MenuState
和PlayState
。我的BaseEngine
中有一个名为DrawBackground()
的虚拟函数,我需要在菜单和播放状态下重新定义它(不同的行为)。现在关键点只有一个状态(Base,Menu或Play)可以初始化窗口。但是我需要它使用不同版本的派生类(菜单和播放)在状态改变时绘制不同的背景。
答案 0 :(得分:0)
你要问的是什么并不是很清楚,但感觉你想要的是策略模式(也就是说,简单来说,改变一些内部对象/算法来完成这项工作)。
在处理继承时,您应该遵循所谓的is-a
关系(Wikipedia on Inheritance)。在您的问题中,GameEngine
不 州(具体为MenuState
)。
您实际应该做的是将状态实施为GameEngine
的策略(请参阅Strategy Pattern on Wikipedia,有些人,包括我,称之为政策模式,这是更多自我解释我认为)。你可以有几个继承的类,比如说BaseState
,你应该通过GameEngine
之类的东西在GameEngine::setState(std::unique_ptr<BaseState> state)
上设置这些状态。 GameEngine
根据其设定的策略采取不同的行动。所以在一个简单的例子中,我们可以说GameEngine::MainLoop()
将调用虚拟BaseState::draw()
函数。因此,绘制的数据仅由GameEngine
上使用GameEngine::setState()
的策略集控制。
简单地说,将行为移至BaseState
策略并更改策略以更改行为。
您可以选择使用某种事件机制来更改策略(state
)。有Boost.Signal,Qt有自己的,还有其他的,但是为了简单的需要实现一个是简单的,更容易感谢C ++ 11。