2009-05-19 11 views
8

Potrzebuję stworzyć niekończący się świat owijania za pomocą Box2D (gdzie współrzędna X wszystkich obiektów to 0 < X < 1000 (powiedzmy)). Grałem w niektóre gry z teleportowaniem obiektów tam iz powrotem, ale czuję, że może być lepszy sposób - jakieś pomysły? Żaden obiekt (lub łańcuch połączonych obiektów) nie będzie miał rozpiętości X większej niż około 50, np. Mniejszej niż szerokość ekranu.Jak stworzyć świat opakowania w Box2D

Aparat może wyświetlać tylko niewielką część świata naraz (około 5% szerokości, 100% wysokości - świat ma około 30 wysokości i 1000 szerokości).

Pozdrawiam.

+1

Czy jesteśmy tutaj we Flashu? Dodaj odpowiedni znacznik języka, aby ułatwić znalezienie pytania. –

+0

Box2D to biblioteka C++ z backendem OpenGL do tworzenia gier 2D lub symulacji. –

+0

Używam faktycznie portu C#, ale nie sądzę, że rozwiązanie byłoby specyficzne dla języka –

Odpowiedz

0

Zaimplementowałem następujące elementy, które nie są idealne, ale nadają się do mojego celu. Jest w tym wiele ograniczeń i nie jest to prawdziwy świat, ale jest wystarczająco dobry.

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); 
       } 
      } 
     } 
    }