Cách tốt nhất để tạo bản đồ cho trò chơi 2D?


16

Tôi xin lỗi vì từ khóa "tốt nhất" chủ quan.

Bạn tôi và tôi đã bắt đầu tạo ra một trò chơi phiêu lưu 2D. Nó sẽ từ trên xuống theo phong cách pokemon hoặc zelda (chỉ là phối cảnh). Chúng tôi đã thảo luận về các phương pháp tạo ra một bản đồ thế giới rộng lớn mà người chơi có thể đi qua mà không làm căng các khả năng bộ nhớ của máy.

Sự thúc đẩy đầu tiên của chúng tôi là tạo ra một bản đồ lớn và một vòng tròn xung quanh người chơi trong đó nội dung sẽ được tải. Chúng tôi cho rằng điều này sẽ không giữ được lâu và quyết định phân vùng bản đồ thành các phần. Đầu tiên chúng tôi có bốn phần lớn, nhưng nhận ra rằng chúng tôi có thể chia nó thành nhiều phần nhỏ.

Tôi đã chơi một số Zelda từ SNES và thấy rằng, trong quá trình dịch chuyển bản đồ, nội dung có thể được tải ngay sau đó. Ý tôi là, thay vì chỉ kiểm tra một khu vực hình chữ nhật để tải dữ liệu, chúng tôi chỉ cần chia bản đồ thành nhiều phần nhỏ để tải và giảm tải dữ liệu khi chúng tôi chuyển từ phần bản đồ sang phần bản đồ.

Hôm nay, anh ấy nói với tôi rằng anh ấy muốn tạo một bản đồ mảng 2D đơn giản [WIDTH] [HEIGHT] chứa dữ liệu về mọi lưới trong trò chơi và là một hoạt động lưu vào đĩa liên tục cho dữ liệu mà chúng tôi không cần.

Tôi không chắc chắn về những ý tưởng này và nghĩ rằng tôi có thể như nó ở đây. Bất kỳ liên kết, tài nguyên hoặc hướng dẫn về chủ đề này sẽ được đánh giá rất cao cũng như câu trả lời trực tiếp cho câu hỏi của chúng tôi về cách thực hiện nó một cách hiệu quả.


Bạn đang sử dụng máy gì?
David Titarenco

Windows với C ++ sử dụng SFML cho đến nay (SFML có thể thay đổi; C ++ thì không). Chúng tôi không nhắm đến atm tính di động.
IAE

2
Nếu bạn đang đi học Zelda cũ trên NES, chỉ sử dụng bản đồ 1 màn hình. Bản đồ nhỏ giúp người chơi tập trung vào phạm vi ý định của họ (ví dụ trong ngục tối, bạn chỉ giao dịch với phòng của mình. Ở diablo, quái vật không di chuyển lên & xuống tầng) và cho phép họ cảm thấy hoàn thành nếu họ đã tìm kiếm toàn bộ khu vực những trò chơi không gian mở như FAllout3 và Oblivion không cung cấp cho bạn.
Stephen Furlani

Câu trả lời:


27

Trước hết, ước tính kích thước bản đồ của bạn. Đừng chỉ cho rằng một "thế giới rộng lớn" sẽ không phù hợp với trí nhớ. Ngày nay, một bản đồ chiếm tới 10 mb trong bộ nhớ là hoàn toàn có thể chấp nhận được và bạn có thể nhét RẤT NHIỀU vào 10 mb trong một thế giới 2D dựa trên gạch đơn giản.

Nếu bạn có một thế giới thực sự rộng lớn, giải pháp mạnh mẽ nhất thực sự là sử dụng các khối bản đồ. Chia thế giới của bạn thành các phần có kích thước cố định (giả sử, 64x64). Tải các khối khi đang di chuyển khi người chơi di chuyển xung quanh, giữ cho ít nhất một khối được tải theo mọi hướng (nghĩa là tải khối mà người chơi đang ở và tất cả các hàng xóm của nó).

Đối với các khối không tải, bạn có thể chọn giữa một số chiến lược. Háo hức dỡ tải có nghĩa là bạn dỡ và lưu vào đĩa tất cả các khối mà người chơi di chuyển đủ xa; nhưng bạn cũng có thể trì hoãn việc dỡ tải để cải thiện hiệu suất (tiết kiệm chunk, vì bất kỳ truy cập đĩa nào, là một hoạt động tốn kém).


6
Một số phép toán minh họa: 10MB Ngói * s giúp bạn có một hình vuông với 1619 ô mỗi bên. Bản đồ của Zelda ban đầu là 256 ô ở cạnh dài và ít hơn một nửa so với bản đồ ngắn - vì vậy bản đồ của bạn có thể lớn hơn 36 lần so với Zelda đầu tiên với mức sử dụng bộ nhớ đó. Bạn có thực sự chuẩn bị để làm cho nhiều nội dung ? (Số)

@ user744 Nhận xét đó là sai lệch đáng kinh ngạc. Để tạo một bản đồ, bạn cần nhiều hơn là chỉ con trỏ tới các ô. Bạn cần lưu trữ dữ liệu mà các ô chứa. Không phải mọi trò chơi 2D đều có số lượng ô cố định được xác định trước.
Jeroen

5

Cá nhân, tôi sẽ xây dựng bản đồ bằng trình chỉnh sửa ô được chỉ định như TileEd . Cách tiếp cận này mang lại một số lợi ích:

  • Sử dụng ít tài nguyên hơn. Bạn chỉ cần tải một tập tin dữ liệu và tập tin dữ liệu với các chỉ mục để xây dựng một bản đồ có khả năng vô tận.
  • Vì bản đồ của bạn sẽ được chia thành các phần rất nhỏ (tùy thuộc vào kích thước ô của bạn), bạn có thể dễ dàng thêm / xóa hàng / cột trong khi nhân vật đang di chuyển khắp thế giới.
  • Có tệp dữ liệu mô tả bản đồ của bạn cũng cho phép bạn thêm thông tin địa hình dễ dàng. Điều này cho phép các loại gạch khác nhau như tường hoặc hồ (tức là chướng ngại vật) hoặc đầm lầy nơi chuyển động của nhân vật có thể bị chậm lại ...
  • Cuối cùng nhưng không kém phần quan trọng, bản đồ dựa trên ô xếp cũng dễ dàng chỉnh sửa và chỉnh sửa hơn sau này vì bạn luôn có thể kích hoạt trình chỉnh sửa, thay đổi một số thứ và lưu tệp dữ liệu mới.

Tôi đề nghị bạn tránh tải các bit của bản đồ trong khi chơi trò chơi để tránh bị lag. Như đã đề cập trước đây, điều này không cần thiết vì có lẽ bạn sẽ có thể giữ bảng xếp hình trong bộ nhớ. Khi nhân vật đi vào một phần khác của "thế giới", bạn có thể hoán đổi tấm ngói bằng một tấm khác (ví dụ: gạch tuyết được thay thế bằng gạch sa mạc).

Làm mờ các ô lên màn hình có lẽ là cách nhanh nhất để hiển thị bản đồ của bạn. Tôi không biết SFML, nhưng từ các tài liệu trên trang của họ, bạn nên xem xét Spritelớp hoặc sử dụng Copychức năng của Imagelớp.

Cập nhật: Tôi chỉ đọc một số tài liệu SFML và bạn chắc chắn nên sử dụng Drawablehoặc Spritethay vì thao túng hình ảnh vì mục đích hiệu suất. Rõ ràng có một trình tải SFML Tiled ngoài kia. Đó có lẽ là một cách tốt để có được một cái gì đó và chạy nhanh.


1

Bắt đầu bằng cách làm cho bản đồ có kích thước cần thiết để kể câu chuyện mà bạn muốn trò chơi kể. Kiểm tra trên máy với thông số tối thiểu cần thiết để mọi người chơi trò chơi của bạn. Nếu nó quá chậm, hồ sơ và tối ưu hóa.


0

Theo tôi, sử dụng một mảng 2D của các ô riêng lẻ là tốt nhất. Bạn có thể có toàn bộ bản đồ lớn dưới dạng một mảng 2D và chỉ vẽ phần của nó cần được hiển thị tại bất kỳ thời điểm nào. Sau đây là một ví dụ về việc sử dụng mảng bản đồ 2D với thư viện trò chơi HTML5 của tabageos (tbgs.js); http://actiontad.com/tabageosHTML5/Examples/BlitMathCameraAndTravelers/


-3

Trừ khi bạn có kế hoạch xây dựng lại tối đa trực tuyến (Fallout 3 hoặc Oblivion), không có lý do gì thế giới cần phải liền mạch. Baldur's Gate và Icewind Dale là hai trò chơi xuất hiện trong tâm trí thực hiện các bản đồ hiệu quả mà không làm mất đi lối chơi.

Cấp, bạn đã có nhiều mã lực điện toán hơn họ đã làm vì vậy việc tải màn hình nên ở mức tối thiểu, nhưng ngay cả Fallout và Oblivion cũng có tải màn hình cho một số thứ.

Tất cả những gì tôi có thể nói với bạn là đối với tôi, tôi đang viết một lib Obj-C nhỏ cho iPhone lấy một lát 32x32 và vẽ nó thành NSImage. Tôi nhận được khoảng 10 khung hình / giây theo cách này và có lẽ tôi nên sử dụng OpenGL, nhưng tôi chỉ cần vẽ lại nếu nhân vật di chuyển ra khỏi trực tràng.

Bạn nên chia bản đồ thành 9 kích thước màn hình (đối với tôi là khối 960x640) vì vậy nếu nhân vật di chuyển ra khỏi khối trung tâm, tôi vẽ lại 9 màn hình thành một hình ảnh lớn (khoảng 1,2 MB - cho rất nhiều phòng dưới giới hạn 20MB trên iPhone 3G). Điều đó xảy ra khá chậm (chậm hơn nhiều so với 10 khung hình / giây) nên việc vẽ lại không đáng chú ý trong khi chơi.

Tôi có thể sẽ chuyển sang OpenGL ES vào một lúc nào đó, nhưng bây giờ nó hoạt động tốt.


[BIÊN TẬP]

Cho phép tôi làm rõ.

Thuật toán vẽ cho nền 9 màn hình mất 0,1 giây (phẳng 10 khung hình / giây). Trừ khi người chơi của bạn có thể đi qua toàn bộ màn hình trong chưa đầy một phần mười giây, việc vẽ lại sẽ không được chấp nhận trong khi chơi.


Chỉ vì 10fps được chấp nhận cho trò chơi của bạn không làm cho nó trở thành một ý tưởng hay, đặc biệt là trên một thiết bị có các hạn chế về năng lượng như iPhone. Bạn có thể thực hiện vẽ lại bằng không, để bên GPU xử lý rasterization và thực sự để chương trình dành thời gian ngủ, để điện thoại không bị nóng hoặc hết pin.

@Joe Wreschnig ... ??? Tôi nói rằng nó được vẽ theo yêu cầu, khi người chơi di chuyển màn hình, nếu không thì hình nền cho UIImageView không được vẽ lại , do đó tiết kiệm năng lượng xử lý. Nhận xét của bạn không có ý nghĩa.
Stephen Furlani

Tôi không đưa ra yêu cầu về khung hình / giây mà trò chơi của bạn yêu cầu. Tôi đang nói, OpenGL có thể cung cấp 60fps cho một thứ tầm thường như vậy (thực sự, bạn thậm chí không nói về "vẽ lại" với các cảnh tĩnh và OpenGL) - nếu bạn chỉ cần 10fps thì sử dụng OpenGL cho phép bạn không lãng phí pin cho "50 khung" khác. Phương pháp vẽ của bạn thật lãng phí trong một thế giới với khả năng tăng tốc GPU. Điều đó có thể ổn trên PC, nhưng không phải khi bạn hết pin.

@Joe, tôi vẫn không chắc bạn đang nói gì. Nó vẽ một hình ảnh. Sau đó, hình ảnh được để lại một mình cho đến khi người chơi đạt đến một ranh giới, và sau đó vẽ lại một hình ảnh mới. Làm thế nào mà lãng phí tuổi thọ pin? Nó chỉ "vẽ" theo yêu cầu và phần còn lại của thời gian xem được vẽ bằng thuật toán vẽ gốc của UIImageView.
Stephen Furlani
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.