我需要用 Box2D 创建一个无尽的包装世界(其中所有对象的 X 坐标为 0 < X < 1000(比如说))。我玩过一些来回传送物体的游戏,但感觉可能有更好的方法——有什么想法吗?没有对象(或链接对象链)将具有大于约 50 的 X 跨度,例如小于屏幕的宽度。
相机一次只能看到世界的一小部分(大约 5% 的宽度,100% 的高度 - 世界大约是 30 高乘以 1000 宽)。
干杯。
我需要用 Box2D 创建一个无尽的包装世界(其中所有对象的 X 坐标为 0 < X < 1000(比如说))。我玩过一些来回传送物体的游戏,但感觉可能有更好的方法——有什么想法吗?没有对象(或链接对象链)将具有大于约 50 的 X 跨度,例如小于屏幕的宽度。
相机一次只能看到世界的一小部分(大约 5% 的宽度,100% 的高度 - 世界大约是 30 高乘以 1000 宽)。
干杯。
我已经实现了以下,这绝不是理想的,但适合我的目的。涉及许多限制,它不是一个真正的包装世界,但它已经足够好了。
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);
}
}
}
}