Tạo một bản đồ trò chơi 2d thế giới mở liền mạch


7

Tôi đang tạo một trò chơi thế giới mở tương tự như Pokemon. Tôi có nên tải bản đồ đầy đủ, hoặc chia nó thành các khối và chỉ tải khu vực gần đó? Tôi không muốn người dùng của mình đến điểm mà nó sẽ chuyển tiếp giữa các bản đồ, như Pokemon.

Nếu tôi chia nó thành nhiều phần, làm thế nào tôi có thể tải chúng liền mạch?


Xin lỗi, nhưng bạn có phiền khi làm rõ ý của bạn bằng cách "bản đồ thứ hai sẽ ở đâu" không? Bạn dường như đã để lại một từ :)
Lysol

3
Thế giới của bạn sẽ rộng lớn như thế nào và nền tảng mục tiêu của bạn là gì? Khi nó thoải mái phù hợp với RAM của nền tảng mục tiêu của bạn, thực sự không có lý do gì để làm quá tải động cơ với việc xử lý khối.
Philipp

Đối với bản ghi, nói chung các trò chơi như Pokemon tải toàn bộ khu vực vào bộ nhớ, nhưng điều quan trọng là (như bạn đề cập) không có khu vực vô tận. Có những khối logic phá vỡ từng khu vực, chẳng hạn như các nhóm đối tượng không thể vượt qua. Không có lý do tại sao bạn không thể sử dụng cùng một cách tiếp cận, nhưng sử dụng một chuyển tiếp liền mạch (nhưng tùy thuộc vào cách bạn thực hiện điều này, cuối cùng bạn có thể có 2 khối lớn trong bộ nhớ tại một số ràng buộc nhất định)
Selali Adobor

Câu trả lời:


1

Câu trả lời ngắn: Phụ thuộc vào kích thước và loại thế giới / bản đồ, nhưng khi nghi ngờ, hãy sử dụng giải pháp dựa trên ô vuông bằng cách sử dụng một mảng.


Bạn có thể hưởng lợi từ việc tạo bản đồ của mình dưới dạng jigzaw 2D, nơi bạn chỉ tải các phần có liên quan mà bạn thực sự cần hiển thị trên màn hình. Cách đơn giản nhất để làm điều này là coi bản đồ của bạn được tạo thành từ các ô, như được thực hiện trong bất kỳ loại trò chơi dựa trên gạch cũ nào, từ Mario đến Civilization 1.

Các trò chơi dựa trên ô xếp thường lưu trữ sự phân chia của các đối tượng trong một mảng, từ đó các hàng và cột của ô cần nhìn thấy được trích xuất và vẽ / định vị trên màn hình. Điều này được thực hiện dựa trên tọa độ x / y của người chơi liên quan đến các thế giới.

Để tải "hàng" hoặc "cột" mới của bản đồ, bạn có thể chỉ cần kiểm tra xem người chơi có đang ở sát mép màn hình hay không và sau đó bắt đầu cuộn bản đồ và tải / vẽ các hàng hoặc cột mới từ mảng nếu cần.

Đối với một số ví dụ xem hướng dẫn này:

http://gamedevelopment.tutsplus.com/tutorials/an-intributiontion-to-creating-a-tile-map-engine--gamedev-10900

Tôi đã tự mình nắm bắt các kỹ thuật hơn 10 năm trước khi thực hiện các trò chơi Flash thông qua các hướng dẫn tuyệt vời (nhưng lỗi thời về mã) này. Mã và ví dụ vẫn có ý nghĩa, nhưng có thể sẽ không hoạt động trong các phiên bản Flash mới hơn):

http://oos.moxiecode.com/blog/index.php/tutorials/

Ngoài ra kiểm tra câu hỏi liên quan này:

Thiết kế toàn bộ bản đồ so với thiết kế mảng gạch


0

Nếu không chắc chắn cách tiến hành, Bạn có 3 phương pháp để thực hiện:

  • Giữ cố định kích thước bản đồ và tạo các bản đồ có cùng kích thước, chỉ cần thao tác điều hướng
  • Sử dụng gạch và tạo bản đồ tải cảnh mỗi lần, (sử dụng mẫu để truy cập nhanh hơn)
  • NHẬN một bản đồ lớn đầy đủ

Bây giờ tôi chưa thực hiện phương pháp 3, nhưng có vẻ như nỗ lực đầu tiên rõ ràng để làm điều đó, và nó có thể kết thúc nếu cuối cùng bạn quyết định giới hạn thế giới lớn của bạn thành mảng và int size = 32;

ĐỐI VỚI PHƯƠNG PHÁP II, bạn phải triển khai mã mảng 2d đơn giản, thiết kế một số ô (như ví dụ của bạn từ pokemon, chứa sa mạc, nước, cỏ và môi trường xung quanh kiểu thành phố) và tải nó từ tham chiếu con trỏ được lưu trữ của bạn

function starter(args:Event)
{
        thumb.startDrag(false, new Tile(track.x, thumb.y, track.width, 0));
}
function stopper(args:Event)
{
        thumb.stopDrag();
}
function mover(args:Event)
{this.Tile={Tile.water[0],Tile.water[1],Tile.grass[3]};}//each as in constructor
void(int * point){//img here}

Đối với phương pháp tôi Bạn sẽ cần một chút công việc ở đây và tạo mẫu cho từng thiết kế ô và sửa chúng ... như nói mảng được sửa cho 100 ô [10X10] hoặc theo kích thước cửa sổ trò chơi của bạn Và theo câu hỏi bạn muốn chúng phải liền mạch để tải mảng

a [10] [10] và [10-20] [10-20], cùng với việc thêm kho lưu trữ mảng tạm thời cho một nửa danh sách đó là

b [10-15] [10-15] = a [10-20] [10-20]:

Và thực hiện chức năng Loại máy ảnh tập trung vào nhân vật của bạn, để bản đồ di chuyển cùng với nhân vật và bạn di chuyển liên tục

Hy vọng điều này trả lời câu hỏi của bạn...

giới thiệu http://pygame.org/project-pyMap+-+2D+Tile+Mapping-2769-.html

http://students.4j.lane.edu/~bortega23/ArcuzGuide.html phần bản đồ trong trò chơi arcuz, bạn có thể thực hiện thu nhỏ và tạo phóng to hơn nữa cho cùng một dữ liệu như trong trò chơi này

hướng dẫn thống nhất 3d cho điểm trò chơi lightource & xem camera


0

Khi phát triển các trò chơi hộp cát mở, bạn luôn phải đối phó với vấn đề này, đôi khi bản đồ được chia thành lưới (Độc lập DayZ), các ngành (Battlestar galactica), voxels (EVE) hoặc các khu vực (như pokemon) và đôi khi nó được lưu trữ trong RAM, nó chỉ phụ thuộc vào mapsize.

Nếu bạn có bản đồ 255x255 chỉ lưu trữ các số nguyên (0: nước, 1: cỏ, v.v.) thì đó sẽ là (255x255x4) 260100 byte (254 kB), vì vậy bạn có thể lưu trữ toàn bộ bản đồ trong một mảng trên ram, nếu không, nếu bạn có cơ sở hạ tầng phức tạp hơn cho mỗi ô hoặc bạn có nhiều ô hơn, bạn sẽ có dữ liệu.

Trong các trò chơi 2D, tôi thích phân chia nó trong các ô và tải ô hiện tại và các phần phụ mà tôi cần mỗi khi thay đổi "currentcell", hãy nhớ rằng đây chỉ là một phân chia "logic".

Bạn có thể lưu trữ toàn bộ bản đồ theo nhiều cách khác nhau, tạo các tệp DDBB thành tệp .dat hoặc .JSON, không vấn đề gì chỉ cần tải các ô mới từ việc lưu trữ trước khi char của bạn đi vào và bạn sẽ có hiệu suất tuyệt vời.

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.