首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在当前2d游戏架构中实现游戏逻辑层的方法

在当前2d游戏架构中实现游戏逻辑层的方法
EN

Stack Overflow用户
提问于 2017-08-25 21:44:15
回答 1查看 232关注 0票数 2

我正在用c++开发一款2d格斗游戏(出于学习目的),我很难弄清楚如何正确地实现游戏逻辑。为了快速了解我当前的体系结构,我有充当数据持有者的组件类,我有“系统”,它们只是设计用来操作这些组件的函数。我有一个scene类,它包含一组当前在游戏中的战斗机,这个场景被传递给各个子系统,然后这些子系统可以自由地作用于战斗机组件,更新战斗机状态:

代码语言:javascript
复制
//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、输入等)所有的fighter组件都被传递到系统函数中,并返回新的值,然后再插入到fighter中:

代码语言:javascript
复制
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);
    }
}

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

EN

回答 1

Stack Overflow用户

发布于 2017-09-12 23:19:32

  1. 在我看来你的目标是,你可以将movementFactor字段存储在fighter中,并允许从游戏逻辑层对其进行更改。在物理课上,增量随后被该场相乘。如果你使用像系统这样的组件,你可能不想手动更新组件,只需要操作数据。
  2. 逻辑更新顺序是一个复杂的问题:想象一只鸡落在一个鸡蛋上。碰巧在同一帧中,鸡接触到鸡蛋,鸡蛋准备向我们展示新的小鸡。应该先执行什么?这取决于首先更新的是什么:物理还是鸡蛋,以及反应是否立即适用的事实。最好的情况(通常是最公平的)是它们不立即应用,而是形成一个对象(组件)状态更改的堆栈,以便它们在操作阶段之后独立解决。

还要确保您不想坚持使用现有的实体系统,如entityx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45882808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档