Question

I need to create an endless wrapping world with Box2D (where the X coordinate of all objects is 0 < X < 1000 (say)). I've played some games with teleporting objects back and forth but it's feeling like there might be a better way - any ideas? No object (or chain of linked objects) will have an X span of more than about 50, eg less than the width of the screen.

The camera can see only a small portion of the world at a time (about 5% width, 100% height - the world is about 30 high by 1000 wide).

Cheers.

Was it helpful?

Solution

I've implemented the following, which is by no means ideal but fit for my purpose. There are many limitations involved and it's not a true wrapping world but it's good enough.

    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);
                }
            }
        }
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top