Trong trò chơi xếp gạch 2d, phương pháp tốt để cuộn là gì?


9

Tôi đang sử dụng Direct3D với trình bao bọc D3DXSPRITE để vẽ các ô lên màn hình. Tôi có một lớp gạch có chứa các thành viên như va chạm và loại gạch, sau đó tôi có một mảng gạch, ví dụ

Lưới ngói [256] [256];

Đó sẽ là một phương pháp tốt hơn?

-Draw người chơi ở giữa màn hình và bù vào nơi bản đồ vẽ.

-Chuyển trình phát với camera sau.

Tôi đã sử dụng phương pháp đầu tiên, nhưng nó thực sự phức tạp khi bạn đến cạnh trên cùng bên trái của bản đồ và khi những người chơi / kẻ thù khác ở trên bản đồ và di chuyển cùng một lúc

Nếu tôi làm cho máy ảnh theo dõi trình phát, tôi có phải gọi spriteBatch-> Draw (...) cho mỗi ô lưới đơn không, mặc dù chỉ một số ít có thể vừa với màn hình?

Câu trả lời:


4

Có lẽ tốt nhất để thực hiện tất cả các cập nhật và tính toán trong các đơn vị thế giới "thực" và di chuyển máy ảnh. SpriteBatch của bạn có thể tự hủy, nhưng nếu quá chậm, bạn có thể cố gắng xác định những ô nào cần được hiển thị trên màn hình và chỉ vẽ những ô đó.


Có lẽ bạn sẽ muốn viết mã để chỉ vẽ những họa tiết có thể nhìn thấy được, đặc biệt nếu bạn thấy rằng bạn cần tăng kích thước của lưới.

2

Di chuyển camera theo tọa độ thế giới và để nhân vật của bạn di chuyển khắp thế giới là cách dễ nhất để tiếp cận vấn đề này, làm việc theo tọa độ thế giới có nghĩa là bạn không cần phải thực hiện bất kỳ phép tính bổ sung nào khi hệ thống này hoạt động trên tất cả các hệ thống khác phải hoạt động trên hệ tọa độ tương đối và cũng hiểu vị trí của chúng trong tọa độ thế giới.

Vì bạn đang làm việc trong 2D, một mẹo hay khác là thực hiện một số phân vùng không gian theo cách dễ nhất là tạo một hệ thống lưới thế giới ảo, điều này sẽ cho phép bạn quản lý từng ô riêng lẻ bằng cách liên kết các họa tiết và các tài nguyên khác trên cơ sở từng ô, vì vậy về bản chất quá trình sẽ là:

  • tạo một số lớp gạch có thể giữ tọa độ biên cho ô và bất kỳ tài nguyên nào mà ô cụ thể có thể cần (họa tiết, kẻ thù, v.v.).

  • quyết định kích thước thế giới của bạn và tạo một mảng 2D (bạn có thể sử dụng một chiều và truy cập dưới dạng 2D) mỗi ô đại diện cho một chút thế giới của bạn với tất cả các tài nguyên được liên kết.

  • chỉ rút tài nguyên từ ô mà người chơi đang ở và hàng xóm của nó.

Với một lưới, bạn có thể dễ dàng tìm ra ô mà người chơi đang ở dựa trên vị trí của nó so với điểm bắt đầu của lưới.

Để giải quyết vấn đề bạn đã đề cập về máy ảnh, bạn cần làm cho máy nghe nhạc và máy ảnh thành hai hệ thống độc lập nơi máy ảnh không di chuyển xa hơn trung tâm của các ô cạnh để khi người chơi di chuyển đến ô đó, anh ta vẫn có thể di chuyển trong suốt toàn bộ ô khi anh ta bị ràng buộc bởi tọa độ thế giới (tức là không còn tập trung vào màn hình) nhưng máy ảnh đã bị khóa.


0

Tôi sử dụng một bề mặt. Tôi tạo toàn bộ thế giới trên một bề mặt màn hình và giữ tọa độ x và y. Tôi thay đổi những thứ này khi người chơi di chuyển và mỗi khung hình vẽ một hình chữ nhật 1028 x 768 từ bề mặt đến bộ đệm lưng bằng x và y.

đối với những người khác, tôi cho họ một x và y và để họ di chuyển khắp thế giới khi họ muốn, khi vẽ tôi kiểm tra xem có x và y có trong hình chữ nhật 1028 x 768 không và nếu có vẽ chúng (tôi sử dụng họa tiết cho mọi người) .

Tôi có người chơi ở giữa màn hình và kiểm tra xem cạnh của thế giới có chạm tới mép màn hình không. Trong trường hợp này, người chơi di chuyển về màn hình đến rìa thế giới và quay lại trung tâm sau đó thế giới bắt đầu di chuyển trở lại. nó có vẻ khó khăn và mất một thời gian nhưng không tệ để làm.

Tôi sử dụng gạch 64 x 64 và thế giới lớn nhất tôi đã sử dụng cho đến nay là gạch 50 x 60.

Tất cả điều này được thực hiện trong x trực tiếp với c ++


1
Điều này có vẻ như một bộ nhớ HUGE. Giữ cho toàn bộ thế giới được vẽ trên bề mặt ngoài màn hình sẽ khiến bạn gặp vấn đề về bộ nhớ một khi bạn bắt đầu muốn làm những việc như có nhiều lớp (hoạt hình) cho thế giới của mình và mở rộng nó hơn những gì bạn có bây giờ. Sẽ tốt hơn nhiều nếu giữ thông tin về thế giới và chỉ vẽ các phần / đối tượng cần được vẽ khi chúng cần được vẽ. Chỉ cần 2 xu của tôi. :)
Richard Marskell - Drackir

@Drackir Tôi nghĩ bạn hiểu lầm. chỉ có thế giới được rút ra khỏi màn hình, những thứ như những người khác được theo dõi và vẽ trên bộ đệm backer khi họ cần. Ngoài ra, tôi không thấy mình làm thế giới 70 x 70 nữa. Khi tôi nói thế giới, ý tôi là khu vực, đây có thể là một thị trấn ngục tối hoặc bên trong một ngôi nhà, khi người chơi di chuyển giữa chúng, bề mặt màn hình tắt được tái tạo lại. vâng, nó chiếm bộ nhớ nhưng gạch 2d trên các ổ terrabite hiện đại làm cho nó không đáng kể và một vài giây tải là một cái giá nhỏ để trả cho việc cuộn và hoạt hình mượt mà. nhưng vâng, có những cách tốt hơn và khó hơn :)
Skeith

Bề mặt phải được lưu trong bộ nhớ thẻ GFX, không phải trên ổ cứng. Tuy nhiên, tôi tin rằng nếu bộ nhớ thẻ GFX quá lớn, nó sẽ di chuyển các bề mặt lên HD, điều này sẽ làm mọi thứ chậm lại đáng kể. Phải thừa nhận rằng đã lâu rồi tôi mới xử lý những thứ đó nên tôi không nhớ chính xác nó hoạt động như thế nào, nhưng tôi đoán chừng nào bạn không vẽ quá lớn về một thế giới thì sẽ ổn thôi. :)
Richard Marskell - Drackir

@Drackir Thật thú vị khi biết, tôi chưa bao giờ nghĩ về nó như thế. Tôi thấy rằng cách này mang lại cho tôi một cuộn mượt mà hơn nếu tôi tự động vẽ các ô mới để tôi nghĩ nó phù hợp nhưng tôi sẽ phải xem xét điều đó.
Skeith

Tôi đang làm việc trong một trò chơi mà tôi có bản đồ 31x31 nhưng chúng được gắn liền với nhau. Tôi đã cố gắng làm việc từ động cơ của người khác và họ sẽ vẽ tất cả các bản đồ xung quanh bản đồ mà người chơi đang ở trên đó; Vì vậy, chín bản đồ trong tổng số. Mỗi bản đồ có một vài lớp (tôi nghĩ là 6). Vì vậy, giống như 31x31x9x6 = 51894 gạch được vẽ (tất nhiên tối đa; không phải tất cả các ô đều đầy) mỗi khi người dùng chuyển bản đồ. Đó là một sự chậm chạp rất lớn đối với tôi, vì vậy tôi đã viết lại thói quen vẽ để chỉ vẽ các viên gạch bao quanh người chơi cách xa 1 ô qua mép màn hình (để xử lý các ô một phần trong khi di chuyển).
Richard Marskell - Drackir

0

Việc mã hóa có một chút đau đớn ở các góc của thế giới lát gạch là điều khá bình thường, khi tìm ra các giai điệu cần vẽ và đồng thời đảm bảo máy ảnh không bị "lạc thế giới". Những trường hợp cạnh đó về cơ bản là điều bắt buộc nhất khi thực hiện một thế giới dựa trên gạch 2D lớn hơn độ phân giải màn hình. Sẽ phức tạp hơn nhiều nếu bạn hỗ trợ phóng to và phóng to con trỏ: D

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.