2016-12-28 26 views
1

有沒有完全複製的Javascript物理學2D引擎,這樣既可以節省模擬的狀態爲一個字節數組,例如,在另一臺機器上加載它(相同的架構),因此這兩個模擬會做同樣的下一步?完全複製的Javascript物理學2D引擎爲網絡對戰

我已經聽說了,Box2D的有一些(緩存?),我們不能隨機構/軍隊/關節等

回答

1

從我的經驗數據存儲,物理引擎狀態的完全複製是困難並且不必要。

對於實時多人遊戲中,你通常運行本地物理模擬和改正的,如果狀態(位置,旋轉,速度)從服務器狀態相差太多。虛幻引擎使用這種方法,閱讀更多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; 
} 
+0

謝謝回答。已經用p2.js引擎做了。 – ElSajko