Làm cách nào tôi có thể ngẫu nhiên tạo địa hình cuộn phụ dựa trên gạch 2D?


11

Tôi muốn tạo ngẫu nhiên một bản đồ cho trò chơi hai bên 2D bằng cách sử dụng các ô sau: nhập mô tả hình ảnh ở đây

Tôi đã tìm thấy một vài bài viết tuyệt vời về quy trình bitmasking, ví dụ: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -method-for-áp dụng-tilemaps /

Tôi thích ý tưởng sử dụng bitmask / tilemask thay vì thực hiện một mệnh đề if lớn hoặc câu lệnh switch.

Tuy nhiên, tôi gặp khó khăn khi hình dung toàn bộ quá trình và không có bài viết nào trong số này nói về ngẫu nhiên.

Gạch của tôi khớp với nhau theo nhiều cách khác nhau, không chỉ là một cách như gạch trong các ví dụ tôi liên kết dường như.

Ví dụ ở đây chỉ là một vài ví dụ:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Vì gạch của tôi khớp với nhau theo nhiều cách khác nhau, tôi không nghĩ mặt nạ 8 bit sẽ hoạt động. Do đó, tôi đã nghĩ đến việc sử dụng bitmask lớn hơn. Một cái gì đó như char [8] hoặc char 4 .

Nếu ai đó có thể vui lòng hiển thị một số mã giả / ví dụ về cách thuật toán chung sẽ trông như thế nào, tôi sẽ đánh giá rất cao nó.

Câu trả lời:


3

Có, kích thước mặt nạ sẽ tăng lên với số lượng tùy chọn ngày càng tăng - liên kết của riêng bạn http://www.saltgames.com/2010/a-bitwise-method-for-appelling-tilemaps/ phần thứ hai giải thích ý chính.

Về bản chất, bạn phải liệt kê các khả năng X cho mỗi 'đường viền' giữa các ô; trong ví dụ cụ thể của bạn, có vẻ như "đỉnh gạch / đáy" có thể là (1) màu trắng (2) được che phủ hoặc (3) được che một nửa - trùng khớp với ví dụ 'trinary' được đưa ra trong bài viết.

Nhưng mặt nạ sẽ chỉ giúp bạn hạn chế các khả năng của gạch đối với các khả năng có thể được vẽ, bởi bản thân nó không phải là một phương pháp chỉ ra cách tạo các bản đồ thực tế một cách hợp lý.

Bộ xếp cụ thể của bạn thực sự khá hạn chế - nó chỉ mô tả một bề mặt tăng / giảm duy nhất và tại bất kỳ điểm bắt đầu 'cấp số nguyên' nào, bạn chỉ có một vài lựa chọn hợp lệ. Ví dụ: sau lát # 2 chỉ có gạch # 1 hoặc # 8 là có thể. Bạn có thể chỉ cần di chuyển từ trái sang phải, tạo một danh sách trong đó (vài) ô có thể đến sau ô trước đó và chọn ngẫu nhiên một trong số chúng.


Tôi nghĩ rằng đây là câu trả lời tôi đang tìm kiếm, tuy nhiên nó vẫn còn một chút mây. Bạn có thể có được một chút chi tiết hơn, bằng văn bản hoặc mã giả về cách phần giải thích cuối cùng của bạn sẽ hoạt động? "Bạn có thể chỉ cần di chuyển từ trái sang phải, tạo một danh sách trong đó (vài) ô có thể đến sau ô trước đó và chọn ngẫu nhiên một trong số chúng."
erebel55

1
Đối với mỗi loại gạch, có một danh sách các gạch được phép sau đó - có rất ít gạch, nó có thể được thực hiện nhanh chóng bằng tay. 'Chiều cao' sẽ thay đổi, lấp đầy mọi thứ bên dưới ô mới với số 10.
Peteris

Ah, vậy bạn đang nói sử dụng phương pháp này thay vì bitmasking?
erebel55

1
Có, bitmasking rất hữu ích nếu tất cả nội dung 2d đều có ý nghĩa, nhưng bản đồ của bạn dường như là một cấp, một bề mặt ngang có chiều cao khác nhau.
Peteris

Điều đó có ý nghĩa, "những ngọn núi" sẽ có độ cao khác nhau và sẽ chảy vào nhau. Vì vậy, về cơ bản nó sẽ là một ngọn núi liên tục thay đổi độ cao khi bạn di chuyển dọc. Sắp xếp giống như một sóng cosine / sin có cường độ ngẫu nhiên tại các điểm khác nhau. Tôi nên di chuyển từ trái sang phải hoặc từ trên xuống dưới khi tạo bản đồ?
erebel55

6

Bạn đã cân nhắc sử dụng chức năng nhiễu Perlin 1D hay Simplex chưa? Có một số lợi thế cho việc này, bao gồm:

  1. Vô hạn (trong phạm vi chính xác của dấu phẩy động), địa hình không lặp lại

  2. Có thể được tạo trong thời gian thực (ngay cả trong một shader, tốc độ nhanh ) hoặc trước thời hạn và được lưu trữ trong kết cấu, như trong ví dụ của bạn

  3. Biên giới tự động khớp với nhau vì cả Perlin và Simplex đều liên tục.

  4. Mặc dù bản thân địa hình là giả ngẫu nhiên, nhưng đủ dễ để áp dụng chức năng bao hoặc chỉ đơn giản là giảm số quãng tám ở những khu vực bạn cần khu vực bằng phẳng hoặc các đặc điểm địa hình cụ thể khác mà bạn cần.

Xem liên kết này để được giải thích khá kỹ lưỡng về việc triển khai Perlin 1D.

Một phong bì về cơ bản là một trường vô hướng hoặc hàm được nhân với hàm nhiễu trước khi lưu hoặc hiển thị đầu ra của bạn.

nhập mô tả hình ảnh ở đây

(Hình ảnh ban đầu mượn từ bài viết tham khảo ở trên.)

Trong ví dụ này, đường màu đỏ đại diện cho hàm piecewise được định nghĩa là

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... có thể được xác định tốt hơn bằng cách sử dụng một chức năng trơn tru. Trong trường hợp này, nó chỉ thu nhỏ mọi thứ xuống 0 trước cao nguyên, sau đó lùi lại thành 1 sau đó.

Cập nhật

Đây là một ví dụ về "địa hình" 3D đơn giản từ một trong các dự án của tôi, với ánh sáng khuếch tán + đặc trưng được áp dụng, được tạo hoàn toàn trong một ống đổ bóng đỉnh + tess + Frag. Đối với tình huống của bạn, tôi sẽ lấy một lát dọc ra khỏi đây để có độ dốc địa hình.

nhập mô tả hình ảnh ở đây

Và một cái nhìn chính tả từ trên xuống:

nhập mô tả hình ảnh ở đây


Đây là một kỹ thuật để tạo ra hình ảnh gạch thực tế chính mình?
erebel55

1
@ erebel55 Có. Bạn có thể sử dụng chức năng 2D để quyết định vị trí (dựa trên ví dụ của bạn) để đặt những đứa trẻ khác nhau trong ảnh và cũng để tạo địa hình dốc. Tôi đã sử dụng điều này trong 3D với kết quả tuyệt vời.
3Dave

Nó trông giống như một phương pháp thú vị, tôi chỉ không chắc là tôi muốn đi theo con đường này vì tôi đã tạo ra hình ảnh của mình.
erebel55

@ erebel55 yeah, không có lý do gì để ném những thứ hiện có nếu nó hoạt động cho bạn.
3Dave

Chà, tôi chưa có thế hệ ngẫu nhiên nào hoạt động, nhưng tôi hy vọng;) Tôi đã cho bạn một phiếu bầu cho phương pháp này, vì nó rất thú vị và tôi có thể sử dụng nó một thời gian trong tương lai. Cảm ơn bạn
erebel55
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.