2016-12-28 3 views
1

Existe-t-il un moteur Javascript Javascript entièrement réplicable, nous pouvons par exemple sauvegarder l'état de simulation comme un tableau d'octets, et le charger dans une autre machine (même architecture) mêmes étapes suivantes?Moteur Physic 2D Javascript entièrement réplicable pour netplay

Je l'ai déjà entendu, Box2D ont une (mise en cache?) Les données que nous ne pouvons pas stocker avec corps/forces/articulations etc.

Répondre

1

D'après mon expérience, la réplication complète de l'état du moteur physique est difficile et inutile. Pour les jeux multijoueurs en temps réel, vous exécutez généralement une simulation de physique locale et y apporter des corrections si l'état (positions, rotations, vélocités) diffère trop de l'état du serveur. Unreal Engine utilise cette approche, lire plus à https://docs.unrealengine.com/udk/Three/NetworkingOverview.html#Physics

Les jeux qui n'ont besoin que de l'état initial d'une scène physique pour exécuter une animation (comme les jeux au tour par tour) n'ont pas non plus besoin de l'état complet du moteur physique. Les moteurs de physique sont deterministic si vous les utilisez de manière déterministe. Pour rejouer une animation physique de la même façon sur les deux clients, garder à l'esprit:

  • Reset (recréez) le b2World avant de lancer la simulation, pour se débarrasser de tout état interne dans le b2World.
  • Configurez votre monde physique, créer des corps à leurs positions initiales, etc.
  • étape la simulation vers l'avant, en utilisant le même pas de temps fixe sur tous les clients (ne pas utiliser le temps delta de trame rendre, car ce n'est pas la même chose pour tous les clients!).
  • Si vous devez interagir avec les corps pendant la simulation (par exemple, appliquer une force), alors il est important de le faire sur le même numéro d'étape.

À titre d'exemple, la fonction suivante retourne le même résultat à chaque fois sur tous les clients, s'ils tous les mêmes 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

Merci pour la réponse. Déjà fait avec le moteur p2.js. – ElSajko