2009-05-19 1794 views
8

Necesito crear un mundo de envoltura sin fin con Box2D (donde la coordenada X de todos los objetos es 0 < X < 1000 (decir)). He jugado algunos juegos con la teletransportación de objetos hacia adelante y hacia atrás, pero parece que podría haber una mejor manera, ¿alguna idea? Ningún objeto (o cadena de objetos vinculados) tendrá un intervalo de X de más de aproximadamente 50, por ejemplo, menos que el ancho de la pantalla.Cómo crear un mundo de envoltura en Box2D

La cámara solo puede ver una pequeña porción del mundo a la vez (alrededor del 5% de ancho, 100% de alto, el mundo tiene 30 de alto por 1000 de ancho).

Saludos.

+1

¿Estamos en Flash aquí? Agregue la etiqueta de idioma adecuada para que las personas puedan encontrar la pregunta más fácilmente. –

+0

Box2D es una biblioteca C++ con un backend OpenGL para desarrollar juegos en 2D o simulaciones. –

+0

En realidad estoy usando el puerto C#, pero no creo que la solución sea específica del idioma –

Respuesta

0

Implementé lo siguiente, que de ninguna manera es ideal pero adecuado para mi propósito. Hay muchas limitaciones involucradas y no es un mundo envolvente, pero es lo suficientemente bueno.

public void Wrap() 
    { 
     float tp = 0; 

     float sx = ship.GetPosition().X;   // the player controls this ship object with the joypad 

     if (sx >= Landscape.LandscapeWidth())  // Landscape has overhang so camera can go beyond the end of the world a bit 
     { 
      tp = -Landscape.LandscapeWidth(); 
     } 
     else if (sx < 0) 
     { 
      tp = Landscape.LandscapeWidth(); 
     } 

     if (tp != 0) 
     { 
      ship.Teleport(tp, 0);     // telport the ship 

      foreach (Enemy e in enemies)   // Teleport everything else which is onscreen 
      { 
       if (!IsOffScreen(e.bodyAABB))  // using old AABB 
       { 
        e.Teleport(tp, 0); 
       } 
      } 
     } 

     foreach(Enemy e in enemies) 
     { 
      e.UpdateAABB();       // calc new AABB for this body 

      if (IsOffScreen(g.bodyAABB))   // camera has not been teleported yet, it's still looking at where the ship was 
      { 
       float x = e.GetPosition().X; 

       // everything which will come onto the screen next frame gets teleported closer to where the camera will be when it catches up with the ship 

       if (e.bodyAABB.UpperBound.X < 0 || e.bodyAABB.LowerBound.X + Landscape.LandscapeWidth() <= cameraPos.X + screenWidth) 
       { 
        e.Teleport(Landscape.LandscapeWidth(), 0); 
       } 
       else if (e.bodyAABB.LowerBound.X > Landscape.LandscapeWidth() || e.bodyAABB.UpperBound.X - Landscape.LandscapeWidth() >= cameraPos.X - screenWidth) 
       { 
        e.Teleport(-Landscape.LandscapeWidth(), 0); 
       } 
      } 
     } 
    } 
Cuestiones relacionadas