用于netplay的完全可复制的Javascript Physic 2D引擎

时间:2016-12-28 21:54:03

标签: javascript box2d physics game-physics

是否有完全可复制的Javascript Physic 2D引擎,因此我们可以将模拟状态保存为例如字节数组,并将其加载到另一台机器(相同的架构)中,以便两个模拟将执行相同的后续步骤?

我已经听过,Box2D有一些(缓存?)数据,我们无法与身体/力量/关节等一起存储。

1 个答案:

答案 0 :(得分:2)

根据我的经验,完全复制物理引擎状态是困难和不必要的。

对于实时多人游戏,如果状态(位置,旋转,速度)与服务器状态差别太大,您通常会运行本地物理模拟并对其进行更正。虚幻引擎使用这种方法,请在https://docs.unrealengine.com/udk/Three/NetworkingOverview.html#Physics

阅读更多内容

只需要物理场景的初始状态来执行动画(例如回合制游戏)的游戏,也不需要完整的物理引擎状态。如果你以确定的方式使用它们,物理引擎是deterministic。要在两个客户端上以相同的方式重新播放物理动画,请记住:

  • 在开始模拟前重置(重新创建)b2World,以摆脱b2World中的任何内部状态。
  • 建立你的物理世界,在初始位置创建身体等等。
  • 在所有客户端上使用相同的固定时间步骤向前进行模拟(使用渲染帧增量时间,因为它在所有客户端上都不相同!)。
  • 如果您需要在模拟过程中与身体互动(例如,施加一个力),那么在相同的步骤编号上进行此操作非常重要。

例如,以下函数每次都会在所有客户端上返回相同的结果,如果它们都得到相同的InitialPhysicsState

float deterministicFunction( InitialPhysicsState state ){
    b2World* world = createWorld(state);
    b2Body* body = world->GetBodyList();
    for(int i=0; i<100; i++){
        if(i==50){
            body->ApplyForce(b2Vec2(10.0f, 2.0f));
        }
        world->Step(0.01f, 8, 3);
    }
    return body->GetPosition().y;
}