Làm thế nào để tạo ra một nền cuộn vô tận?


8

Tôi cần thêm một nền cuộn vào trò chơi của mình, hình ảnh là 512x512px. Đó là một trò chơi xe hơi với giao thông hai chiều và tôi muốn có thể vượt qua phía đối diện và lái xe ngược lại. Trò chơi ở chế độ dọc và tôi sử dụng cocos2d.

Làm thế nào tôi có thể làm điều này theo cách tốt nhất có thể?


Nền sẽ bao quanh x và y hoặc chỉ theo một hướng?
Ricket

Ngoài ra kích thước màn hình là gì? Tức là màn hình sẽ luôn nhỏ hơn 512x512?
Ricket

Câu trả lời:


7

Về cơ bản, tôi sẽ tạo một tilemap 2x2 trong đó các ô xảy ra là 512x512 và tất cả đều giống nhau. Cuộn qua nó như bình thường nhưng ngay sau khi X vượt quá 512 trừ 512 (hoặc thực hiện modulo 512 - nhưng hãy cẩn thận với các số âm), tương tự với Y. Vì vậy, thay vì một poly bạn vẽ 4, mặc dù chỉ có 1 hầu hết thời gian, nhưng trên các trường hợp viền, cả 4 đều có thể nhìn thấy (ví dụ khi bạn đi 400 xuống và 400 sang phải). Bằng cách này, nó sẽ di chuyển mãi mãi.

Tất nhiên bạn cũng có thể sử dụng 4 sprite thay vì tilemap. Một tại worldPos, một tại worldPos + (512,0), một tại worldPos + (0,512) và một tại worldPos + (512,512).
Hãy chắc chắn rằng worldPos luôn là modulo 512 và một lần nữa nó sẽ cuộn mãi mãi.

Đã chỉnh sửa để thêm một số mã:

Chưa được kiểm tra, không được kiểm tra cú pháp.
Rất cứng để giải quyết vấn đề này. Sẽ tốt hơn với một mảng thực tế cho bản đồ, nhưng đối với vấn đề cụ thể này, nó sẽ hoạt động.
Giả sử 0,0 là trên cùng bên trái của màn hình.

void DrawBG( int worldX, int worldY)
{
   const int tileW = 512;
   const int tileH = 320;

   int worldXMod = worldX % tileW;
   if (worldXMod < 0) worldXMod += tileW;   // handle negative numbers

   int worldYMod = worldY % tileH;
   if (worldYMod < 0) worldYMod += tileH;   // handle negative numbers

   int tileLeft = -worldXMod;
   int tileTop  = -worldYMod;

   int spriteTopLeftY = tileLeft;
   int spriteTopLeftY = tileTop;

   int spriteTopRightX = spriteTopLeftX + tileW;
   int spriteTopRightY = spriteTopLeftY;

   int spriteBottomLeftX = spriteTopLeftX;
   int spriteBottomLeftY = spriteTopLeftY + TileH;

   int spriteBottomRightX = spriteTopRightX;
   int spriteBottomRightY = spriteBottomLeftY;

   // whatever the syntax of sprite drawing or setting its position is...
   DrawSprite(spriteTopLeftX, spriteTopLeftY);
   DrawSprite(spriteTopRightX, spriteTopRightY);
   DrawSprite(spriteBottomLeftX, spriteBottonLeftY);
   DrawSprite(spriteBottomRightX, spriteBottomRightY);
}

Trong trường hợp modulo, số âm không phải là vấn đề (ít nhất là đối với Objective-C; trong Java, chúng là).
Ricket

Có thật không? Được rồi ... nó phụ thuộc vào máy, tôi đoán iPhone là may mắn. Haven đã không chạm vào Objective-C trong một năm rưỡi.
Kaj

Thực ra, thành thật mà nói, tôi chưa thực sự thử nó trên Objective-C. Tôi đang đưa ra một phỏng đoán có giáo dục dựa trên thực tế rằng AFAIK Java là người duy nhất mà% không phải là modulo, đó là "phần còn lại". Bất kỳ ngôn ngữ nào khác tôi từng thấy xử lý% như modulo; -1% 3 phải là 2. Nhưng trong Java, đó là 1. Tôi chưa thử nghiệm Objective-C theo nghĩa đen nhưng nếu nó hoạt động như vậy thì -1% 3 là 2 và thực sự modulo sẽ hoạt động chính xác ngay cả đối với các số âm.
Ricket

Không, trong C, (rõ ràng là quá lười để kiểm tra tiêu chuẩn vào giờ vô duyên này) phụ thuộc vào máy. Tôi vừa xác minh trên máy tính xách tay của mình rằng -5% 3 bằng -2.
Kaj

Ai đó có thể gửi một số mã xin vui lòng, tất cả những con số này chỉ làm tôi choáng váng. Tôi đã phát triển được gần 3 tháng nên tôi chưa phải là chuyên gia. Tôi thích 4 cách mà Kaj nói về nó, nghe có vẻ là cách dễ nhất. Bạn có thể chỉ cho tôi một mẫu mã cho việc này không, tôi học nhanh hơn từ việc xem mã và chơi xung quanh nó. Tôi đã thay đổi kích thước hình ảnh thành 512x320px. Có ai có thể giúp tôi không? David
David Holmes

2

Nếu tôi hiểu bạn chính xác, bạn có thể tạo một bộ hình ảnh. Mỗi hình ảnh có một điểm vào và một điểm thoát. Để làm cho mọi thứ dễ dàng, bạn có thể thực hiện tất cả các điểm nhập cảnh và thoát khỏi cùng một vị trí. Sau đó, bạn có thể ngẫu nhiên đi giữa các hình ảnh khác nhau để người chơi không gặp phải mức độ dư thừa hoàn toàn. Nếu bạn muốn trộn mọi thứ lên một chút, bạn có thể tạo các hình ảnh có lối vào và lối ra khác nhau. Bạn sẽ chỉ phải làm thêm một chút công việc để đảm bảo lối ra của một hình ảnh phù hợp với lối vào của hình ảnh tiếp theo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.