Trước hết, hãy để tôi nói rằng các game nhập vai 2D gần gũi và thân thuộc với tôi và làm việc với các công cụ MORPG DX7 VB6 cũ (đừng cười, đó là 8 năm trước, bây giờ :-)) là điều đầu tiên khiến tôi quan tâm đến việc phát triển trò chơi . Gần đây, tôi bắt đầu chuyển đổi một trò chơi mà tôi đã làm việc trên một trong những công cụ đó để sử dụng XNA.
Điều đó nói rằng, đề nghị của tôi là bạn sử dụng cấu trúc dựa trên gạch với phân lớp cho bản đồ của bạn. Với bất kỳ API đồ họa nào bạn sử dụng, bạn sẽ có giới hạn về kích thước họa tiết bạn có thể tải. Chưa kể các giới hạn bộ nhớ kết cấu card đồ họa. Vì vậy, xem xét điều này, nếu bạn muốn tối đa hóa kích thước bản đồ của mình trong khi không chỉ giảm thiểu số lượng và kích thước họa tiết bạn tải vào bộ nhớ mà còn giảm kích thước tài sản của bạn trên ổ cứng của người dùng VÀ thời gian tải, bạn chắc chắn sẽ muốn đi với gạch.
Theo như triển khai, tôi đã đi sâu vào chi tiết về cách tôi xử lý nó trong một vài câu hỏi ở đây trên GameDev.SE và trên blog của tôi (cả hai được liên kết bên dưới), và đó không chính xác là những gì bạn đang hỏi nên tôi sẽ chỉ đi vào những điều cơ bản ở đây Tôi cũng sẽ lưu ý các tính năng của gạch giúp chúng có lợi khi tải một số hình ảnh được kết xuất sẵn lớn. Nếu bất cứ điều gì không rõ ràng, cho tôi biết.
- Điều đầu tiên bạn cần làm là tạo một lát gạch. Đây chỉ là một hình ảnh lớn chứa tất cả các ô của bạn được căn chỉnh trong một lưới. Điều này (và có thể thêm một tùy thuộc vào số lượng gạch) sẽ là điều duy nhất bạn cần tải. Chỉ cần 1 hình ảnh! Bạn có thể tải 1 trên mỗi bản đồ hoặc một bản đồ với mọi ô trong trò chơi; bất cứ tổ chức nào làm việc cho bạn.
- Tiếp theo, bạn cần hiểu làm thế nào bạn có thể lấy "tờ" đó và dịch từng ô thành một số. Điều này khá đơn giản với một số phép toán đơn giản. Lưu ý rằng phép chia ở đây là phép chia số nguyên , vì vậy các vị trí thập phân được bỏ (hoặc làm tròn xuống, nếu bạn thích).
OK, bây giờ bạn đã chia ô gạch thành một chuỗi các ô (số), bạn có thể lấy các số đó và cắm chúng vào bất kỳ vật chứa nào bạn thích. Để đơn giản, bạn chỉ có thể sử dụng một mảng 2D.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
Tiếp theo, bạn muốn vẽ chúng. Một trong những cách bạn có thể làm cho việc này hiệu quả hơn rất nhiều (tùy thuộc vào kích thước bản đồ) là chỉ tính các ô mà máy ảnh hiện đang xem và lặp qua các ô đó. Bạn có thể thực hiện việc này bằng cách tìm nạp tọa độ mảng ô bản đồ của các góc trên cùng bên trái ( tl
) và dưới cùng bên phải ( br
) của máy ảnh . Sau đó lặp từ tl.X to br.X
và trong một vòng lặp lồng nhau, từ tl.Y to br.Y
để vẽ chúng. Mã ví dụ dưới đây:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- Giải độc đắc! Đó là những điều cơ bản của động cơ gạch. Bạn có thể thấy rằng thật dễ dàng để có một bản đồ 1000x1000 mà không có quá nhiều chi phí. Ngoài ra, nếu bạn có ít hơn 255 ô, bạn có thể sử dụng một mảng byte cắt giảm bộ nhớ xuống 3 byte cho mỗi ô. Nếu một byte quá nhỏ, một ushort có thể sẽ đủ cho nhu cầu của bạn.
Lưu ý: Tôi đã bỏ qua khái niệm tọa độ thế giới (đó là vị trí máy ảnh của bạn sẽ dựa vào đâu) vì tôi nghĩ, nằm ngoài phạm vi của câu trả lời này. Bạn có thể đọc về điều đó ở đây trên GameDev.SE.
Tài nguyên Động cơ Ngói của tôi
Lưu ý: Tất cả những tài nguyên này được nhắm mục tiêu tại XNA, nhưng nó áp dụng khá nhiều cho mọi thứ - bạn chỉ cần thay đổi các lệnh gọi rút thăm.
- Câu trả lời của tôi cho câu hỏi này phác thảo cách tôi xử lý các ô bản đồ và xếp lớp trong trò chơi của mình. (Xem liên kết thứ ba.)
- Câu trả lời của tôi cho câu hỏi này giải thích cách tôi lưu trữ dữ liệu ở định dạng nhị phân.
- Đây là bài đăng blog đầu tiên (tốt, kỹ thuật thứ hai, nhưng "kỹ thuật") đầu tiên về sự phát triển của trò chơi mà tôi đang làm việc. Toàn bộ loạt bài chứa thông tin về những thứ như đổ bóng pixel, ánh sáng, hành vi gạch, chuyển động và tất cả những thứ thú vị đó. Tôi thực sự đã cập nhật bài đăng để bao gồm nội dung câu trả lời của tôi cho liên kết đầu tiên tôi đã đăng ở trên, vì vậy bạn có thể muốn đọc nó thay vào đó (tôi có thể đã thêm những thứ). Nếu bạn có bất kỳ câu hỏi nào, bạn có thể gửi bình luận ở đó hoặc ở đây và tôi rất sẵn lòng giúp đỡ.
Tài nguyên động cơ ngói khác
- Hướng dẫn về công cụ gạch từ trang web này đã cho tôi cơ sở mà tôi đã sử dụng để tạo bản đồ của mình.
- Tôi chưa thực sự xem các video hướng dẫn này vì tôi không có thời gian, nhưng chúng có thể hữu ích. :) Tuy nhiên, chúng có thể bị lỗi thời, nếu bạn đang sử dụng XNA.
- Đây trang web có một số hướng dẫn hơn (tôi nghĩ) được dựa trên các đoạn video trên. Nó có thể là giá trị kiểm tra.