2009-05-19 19 views
8

Tôi cần tạo ra một thế giới gói vô tận với Box2D (trong đó tọa độ X của tất cả các đối tượng là 0 < X < 1000 (nói)). Tôi đã chơi một số trò chơi với các đối tượng teleporting qua lại nhưng nó cảm thấy như có thể có một cách tốt hơn - bất kỳ ý tưởng? Không có đối tượng nào (hoặc chuỗi các đối tượng liên kết) sẽ có khoảng X lớn hơn khoảng 50, ví dụ nhỏ hơn chiều rộng của màn hình.Cách tạo ra một thế giới bao quanh trong Box2D

Máy ảnh chỉ có thể nhìn thấy một phần nhỏ của thế giới tại một thời điểm (khoảng 5% chiều rộng, chiều cao 100% - thế giới có chiều cao khoảng 30 đến 1000).

Chúc mừng.

+1

Chúng ta có trong Flash ở đây không? Vui lòng thêm thẻ ngôn ngữ thích hợp để mọi người có thể tìm thấy câu hỏi dễ dàng hơn. –

+0

Box2D là một thư viện C++ với phụ trợ OpenGL để phát triển trò chơi hoặc mô phỏng 2D. –

+0

Tôi thực sự đang sử dụng cổng C# nhưng tôi không nghĩ giải pháp sẽ là ngôn ngữ cụ thể –

Trả lời

0

Tôi đã thực hiện những điều sau đây, điều này không có ý nghĩa lý tưởng nhưng phù hợp với mục đích của tôi. Có rất nhiều hạn chế liên quan và nó không phải là một thế giới gói thực sự nhưng nó đủ tốt.

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); 
       } 
      } 
     } 
    } 
Các vấn đề liên quan