1

我目前正在用 C++ 开发一个回合制 RPG(类似流氓),并且我在我的代码中创建了一个看起来像某种设计模式的简洁架构,因为我记得在其他一些项目中看到过这样的代码结构。我想知道这是否是我偶然发现的某种设计模式,如果是,它的名称是什么。我在程序的其他部分特意应用了一些模式,例如Factory和Singleton,但下面是对程序另一部分的粗略描述,我不知道是不是模式:

我有一个名为GameElement的基类,它是可能出现在游戏字段中的每个对象的根。这个类实现了所有子类继承的关于四处移动、检测碰撞等的基本和复杂的行为,因为无论元素的类型如何,它都是常见的行为。另外,它有 2 个虚拟方法,默认情况下什么都不做,但可以被子类覆盖:handleCollision(GameElement* e)handleTurn()。可以重新实现handleCollision方法,以便对象在与另一个对象(尤其是玩家)发生碰撞时知道该怎么做,以及方法handleTurn存在,以便对象有机会在轮到他们时做他们想做的任何事情。到目前为止,我已经创建了几个子类,即SolidElementPushableElementFighterElement(用于玩家和敌人)、继承 FighterElement 的PlayerElement(玩家)和也继承FighterElementEnemyElement(万恶之根

还有一个名为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 事件循环。

如果这个架构是某种设计模式,并且如果我知道它是什么模式,那么我在其他项目中使用它会容易得多,并且在我需要或有的时候向其他人解释它会花费更少的时间至。

4

2 回答 2

1

不完全是您所拥有的,但许多模拟器的模式基于OODA 循环- 观察、定向、决定、行动 - 或变体 Sense Decide Act 。在具有可视化的游戏或模拟器中,您将渲染标记到每个循环周期中。

对于您的游戏,handlePlayerCollisions()是观察步骤的一部分 - 每个组件都在确定它是否与玩家在同一个位置。大概handleTurns()有决定跟随或逃离玩​​家,以及其他决定和行动。updateScreen呈现当前游戏状态。将行动与观察和决定分开允许模拟从已知状态计算所有观察,然后根据已知观察计算决策,然后根据这些决策计算动作,这意味着您不会扭曲模拟,因此后面的实体正在观察早期实体的行动结果同一个周期。但是由于您仅限于仅观察玩家并集中观察、决定和行动,因此您没有这种保证(除非updateScreen还包括更新模拟状态)。

游戏中的实体是单一的深层层次结构、组件的聚合还是智能行为的协调是另一个讨论。

于 2012-07-14T10:26:44.010 回答
0

您描述的方法是“模板方法”(GoF)模式 http://www.vincehuston.org/dp/template_method.html的实现

于 2012-07-14T10:01:13.113 回答