我目前正在用 C++ 开发一个回合制 RPG(类似流氓),并且我在我的代码中创建了一个看起来像某种设计模式的简洁架构,因为我记得在其他一些项目中看到过这样的代码结构。我想知道这是否是我偶然发现的某种设计模式,如果是,它的名称是什么。我在程序的其他部分特意应用了一些模式,例如Factory和Singleton,但下面是对程序另一部分的粗略描述,我不知道是不是模式:
我有一个名为GameElement的基类,它是可能出现在游戏字段中的每个对象的根。这个类实现了所有子类继承的关于四处移动、检测碰撞等的基本和复杂的行为,因为无论元素的类型如何,它都是常见的行为。另外,它有 2 个虚拟方法,默认情况下什么都不做,但可以被子类覆盖:handleCollision(GameElement* e)和handleTurn()。可以重新实现handleCollision方法,以便对象在与另一个对象(尤其是玩家)发生碰撞时知道该怎么做,以及方法handleTurn存在,以便对象有机会在轮到他们时做他们想做的任何事情。到目前为止,我已经创建了几个子类,即SolidElement、PushableElement、FighterElement(用于玩家和敌人)、继承 FighterElement 的PlayerElement(玩家)和也继承FighterElement的EnemyElement(万恶之根)。
还有一个名为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 事件循环。
如果这个架构是某种设计模式,并且如果我知道它是什么模式,那么我在其他项目中使用它会容易得多,并且在我需要或有的时候向其他人解释它会花费更少的时间至。