如何将游戏逻辑层实现到当前的2D游戏架构中

时间:2017-08-25 13:44:15

标签: c++ architecture game-engine game-loop

我正在用c ++开发一款2D战斗游戏(用于学习目的),我很难搞清楚如何正确实现游戏逻辑。为了快速了解我当前的架构,我有一些组件类作为数据持有者,我有'系统',它们只是用于对这些组件起作用的功能。我有一个场景类,其中包含一系列目前在游戏中的战士,这个场景被传递给各个子系统,然后可以自由地对战斗机组件起作用,更新战士状态:

//Add a fighter object to array of fighters and set starting position
scene.CreatePlayerFighter(160.0f, 0.0f);
scene.CreateAIFighter(80.0f, 45.0f);

gameWolrd.Init(scene);
Renderer.Init(scene, window);
AI.Init(scene);
//etc...

//Game loop
while (true)
{
    Input.Update(scene);

    Physics.Update(scene);
    AI.Update(scene);
    //etc....

    window.ClearBuffers();

    Renderer.Update(scene, colorShaderProgram);

    window.SwapBuffers();
}

同样,在每个子系统(渲染器,AI,输入等)内部,所有战斗机组件都被传递到系统功能中并用新值吐出,然后插入战斗机中:

void Physics::Update(Scene& scene)
{
    for (Fighter& fighter : scene.fighters)
    {
        //Update fighter position based on fighter's current velocity which has been set by input
        TransformComponent newFighterPosition = System::MoveFighter(fighter.GetComponent<TransformComponent>(), fighter.GetComponent<VelocityComponent>());

        //Insert new TransformComponent to update fighter's position
        fighter.Insert<TransformComponent>(newFighterPosition);
    }
}

这种当前架构具有loosley耦合的优点,因为我可以非常轻松地添加和删除系统,而不会直接影响战斗机类或其组件。问题是一切都是绝望的连续,因为我的场景被逐个传递到每个子系统来更新战士。我提到这个问题是因为我实现游戏逻辑层的一个想法是让更高级别的类直接调用特定的游戏引擎系统函数,如physics.MoveFighter(TransformComponent, VelocityComponent, float amountToMove);,我可以在其中添加其他参数以在游戏逻辑层给用户更多控制。当然,以这种方式做事意味着系统功能将以游戏逻辑用户认为合适的任何顺序被调用和调用。是否有办法以这种方式实现游戏逻辑层,并且可能将所有调用排队并重新排序以在游戏引擎中正确运行?或者是否有更好的方法在我当前的架构中尝试和实现游戏逻辑?

1 个答案:

答案 0 :(得分:0)

  1. 当我看到你的目标时,你可以将movingFactor字段存储在战斗机中,并允许从游戏逻辑层更改它。在物理类中,delta由该字段进行多重处理。如果您使用类似系统的组件,您可能不希望手动更新组件,只能使用数据。

  2. 逻辑更新顺序是一个复杂的问题:想象一只鸡落在鸡蛋上。碰巧在同一个框架中,鸡接触鸡蛋,鸡蛋准备向我们展示新的小鸡。应该先执行什么?这取决于首先更新的内容:物理或蛋,以及反应是否立即应用的事实。最好的情况(通常最公平)是他们不立即申请,而是形成一堆对象(组件)状态变化,以便在行动阶段后独立解决。

  3. 另外,请确保您不想坚持使用entityx等现有实体系统。