2017-08-25 56 views
2

我正在用C++开发2D战斗游戏(用于学习目的),而且我很难搞清楚如何正确实现游戏逻辑。为了快速浏览我当前的体系结构,我有作为数据持有者的组件类,并且我拥有“系统”,这些“系统”只是设计用于处理这些组件的功能。我有保持当前正在游戏的战士的阵列的场景类和该场景被传递给各个子系统然后可以自由地对战斗机部件起作用,更新战士状态:将游戏逻辑层实现为当前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); 
    } 
} 

该电流架构具有的优点因为我可以非常容易地添加和删除系统,而不影响战斗机类或组件直接跳转。问题是一切都是绝望的连续,因为我的场景被逐一传递到每个子系统来更新战士。我提到这个问题是因为我的一个想法是实现一个游戏逻辑层,就是让更高等级的类直接调用特定的游戏引擎系统函数,如physics.MoveFighter(TransformComponent, VelocityComponent, float amountToMove);,我可以在其中添加额外的参数,以便让用户在游戏逻辑层级更具控制力。当然,以这种方式做事意味着系统功能将以游戏逻辑的用户所看到的任何顺序被调用和调用。有没有办法以这种方式仍然实现游戏逻辑层,并可能将所有调用排队并重新排列它们以在游戏引擎中正确运行?或者是否有更好的方法来尝试在当前体系结构中实现游戏逻辑?

+0

你可以做的一个方法是建立一个新的系统让RW访问所有的组件和战斗机,然后把它放在帧的结尾打勾? –

回答

0
  1. 当我看到你的目标,你可以只存储movementFactor领域中的战斗机,并允许它从游戏逻辑层改变。在物理课上,三角洲则由该领域培育出来。如果您使用类似系统的组件,则可能不想手动更新组件,只能使用数据进行操作。

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

此外,请确保您不想坚持像entityx这样的现有实体系统。