我目前正在C++中开发一个基于回合的RPG(类似流氓),并且在我的代码中创建了一个整洁的架构,看起来像某种设计模式,因为我记得在其他一些项目中看到过这样的代码。我想知道这是否是我偶然发现的某种设计模式,如果是的话,它的名字是什么。我在程序的其他部分故意应用了Factory和Singleton等一些模式,但以下是对该程序的另一部分的粗略描述,我不知道它是否是模式:这是一种设计模式吗?如果是这样,它的名字是什么?
我有一个叫做的基类GameElement,它是可能出现在游戏领域内的每个对象的根。这个类实现了关于四处移动,检测碰撞等基本和复杂的行为,所有的子类都继承,因为它是常见的行为,而不管元素的类型如何。此外,它有2个虚拟方法,默认情况下什么都不做,但可以被子类重写:handleCollision(GameElement * e)和handleTurn()。方法可以被重新实现,使得物体在与另一个物体碰撞时(特别是与玩家碰撞)知道该做什么,并且方法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方法。此外,方法handleTurns被调用,它几乎与handlePlayerCollisions一样,除了它在每个元素中调用handleTurn以便他们可以做他们喜欢的事情。另一种方法是updateScreen,它的名字就是这么做的。最后一件事是用于处理关键输入的SDL事件循环。
如果这种体系结构是某种设计模式,并且如果我知道它是什么模式,那么在其他项目中使用它会容易得多,并且当向其他人解释它时将花费更少的时间我需要或必须。
不知道这个设置是否有名称,而不是“深层次的混乱”。如果它是一种设计模式,那么它就是一种反模式,因为它通常被认为是糟糕的设计。见例如这篇文章的更多关于这个问题,以及如何更好地做到这一点:http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ – haffax
有趣的文章,谢谢。 –
苛刻。我不知道OP只是指关于模式问题的他的游戏实体层次结构。无论如何,模式通常不是整个程序或框架或引擎。你在这里得到的比一个模式更大。 – tcarvin