我目前正在用C ++开发一个基于回合制的RPG(类似流氓),我在我的代码中创建了一个整洁的架构,看起来像一些设计模式,因为我记得在其他一些项目中看到了这样的代码结构。我想知道这是否是某种我偶然发现的设计模式,如果是这样,它的名字是什么。我故意在程序的其他部分应用了一些模式,如Factory和Singleton,但以下是程序另一部分的粗略描述,我不知道它是否是一个模式:
我有一个名为 GameElement 的基类,它是游戏字段中可能出现的每个对象的根。此类实现了有关四处移动,检测冲突等所有子类继承的基本和复杂行为,因为无论元素的类型如何,它都是常见行为。此外,它有2个虚拟方法,默认情况下不执行任何操作,但可以通过子类覆盖: handleCollision(GameElement * e)和 handleTurn()。可以重新实现 handleCollision 方法,以便对象知道在与另一个对象(尤其是播放器)发生碰撞时要做什么,并且方法 handleTurn 存在,以便对象轮到他们时,有机会做任何他们想做的事。到目前为止,我已经创建了几个子类,即 SolidElement , PushableElement , FighterElement (对于玩家和敌人), PlayerElement (玩家)继承 FighterElement , EnemyElement (所有邪恶之根)也继承了 FighterElement 。
还有一个名为 GameEngine 的类,它在 run()方法中封装了游戏循环(也有SDL事件循环)。这是此方法的(相当短的)实现:
void GameEngine::run()
{
SDL_Event evt;
while ( running ) {
handlePlayerCollisions();
handleTurns();
updateScreen();
delay();
SDL_PollEvent(&evt);
if ( evt.type == SDL_KEYDOWN )
handleKeyInput( evt.key.keysym.sym );
continue;
}
}
在游戏循环中,它调用 handlePlayerCollisions ,它有一个循环,通过当前场景中的整个 GameElement * 容器,调用 handleCollision(player) 在每一个中,如果该元素与玩家发生碰撞,根据元素的类型,它可以对玩家做一些事情,如伤害,阻挡他的方式,移动(即被推动) ),或该类在其 handleCollision 方法中实现的任何其他内容。此外,调用 handleTurns 方法,它与 handlePlayerCollisions 几乎完全相同,只是它在每个元素中调用 handleTurn 以便它们可以做他们喜欢的事。另一个名为 updateScreen 的方法正好与其名称所做的完全相同。最后一件事是用于处理键输入的SDL事件循环。
如果这种架构是某种设计模式,如果我知道它是什么样的模式,那么在其他项目中使用它会更容易,而当我将其解释给其他人时则需要更少的时间需要或必须。
答案 0 :(得分:1)
不完全是你所拥有的,但许多模拟器的模式基于OODA loop - 观察,定位,决定,行动 - 或变体Sense Decide Act。在具有可视化的游戏或模拟器中,您将渲染标记到每个循环周期中。
对于您的游戏,handlePlayerCollisions()
是观察步骤的一部分 - 每个组件都在确定它是否与玩家在同一个地方。据推测,handleTurns()
有决定跟随或逃避玩家,以及其他决定和行动。 updateScreen
呈现当前的游戏状态。从观察和决定中分离行为允许模拟计算来自已知状态的所有观测值,然后根据已知观测值计算决策,然后根据这些决策计算行动意味着您不会偏离模拟,因此后面的实体正在观察早期实体的行为结果。同样的周期。但是因为你只限于观察玩家而且集中观察,决定并一起行动你没有这种保证(除非updateScreen
还包括更新模拟状态)。
游戏中的实体是否是单一的深层次结构,组件的聚合或智能行为的音乐会是另一种讨论。
答案 1 :(得分:0)
您描述的方法是“模板方法”(GoF)模式的实现 http://www.vincehuston.org/dp/template_method.html