Cómo crear un mundo envoltura en Box2D
-
22-08-2019 - |
Pregunta
Es necesario crear un mundo sin fin, con envoltura Box2D (donde la coordenada X de todos los objetos es 0 La cámara puede ver sólo una pequeña parte del mundo a la vez (anchura aproximadamente 5%, altura 100% - el mundo es de aproximadamente 30 de alto por 1.000 de ancho) Saludos.
Solución
He aplicado los siguientes, que de ningún modo es ideal, pero en forma para mi propósito. Hay muchas limitaciones implicadas y no es un verdadero mundo de envolver, 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);
}
}
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow