Làm thế nào tôi có thể tạo một đường dẫn dungeon tuyến tính (tương đối)?


8

Chúng tôi phát triển một khái niệm cho một bộ phận phụ hành động. Những gì chúng ta cần là một cách để tạo ra một bản đồ thẳng (tương đối). Bằng cách này, tôi có nghĩa là ...

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

Rõ ràng để thấy rằng bản đồ này đi theo một tuyến đường đơn giản, ngay cả khi nó bị lệch một chút. Cùng với đó, chúng tôi cũng sẽ thực hiện các con đường đi lạc - lối tắt hoặc lối đi bí mật. Vì vậy, có lẽ, để đi từ khu vực được khoanh tròn thứ ba đến khu vực thứ tư, bạn sẽ có con đường chính và một lối đi bí mật chứa đầy kẻ thù mạnh hơn, nhưng nhanh hơn và có phần thưởng cao hơn.

Ở đây chúng tôi đã đạt đến một bế tắc. Chúng tôi đang khám phá một vài lựa chọn nhưng thực sự không có tiến triển gì. Cách tiếp cận nào chúng ta có thể sử dụng để tạo ra loại đường dẫn này Chúng ta không bị ràng buộc bởi các ngôn ngữ lập trình, cho đến nay chúng ta đã thử nghiệm với Java, C # và C ++. Tương tự, chúng tôi không có bất kỳ sự phụ thuộc hiện tại nào vào các công cụ trò chơi cụ thể.


11
Tôi muốn nói thêm rằng nó không rõ kết quả cuối cùng mà bạn đang tìm kiếm là gì. 'Bản đồ' mà bạn hiển thị là chế độ xem từ trên xuống của một khu vực. Bạn đang phát triển bộ điều khiển phụ 2d . Làm thế nào là 2 liên quan?
Vaillancourt

Tôi đã loại bỏ cụm từ "tốt nhất" khỏi câu hỏi của bạn, vì nó không thực sự hữu ích. Tôi cũng loại bỏ ba cách tiếp cận được đề xuất của bạn, tất cả đều là câu trả lời hợp lệ. Nói chung sẽ tốt hơn nếu bạn không bao gồm các giải pháp tiềm năng trong câu hỏi của mình vì so sánh các giải pháp được cung cấp thường không phải là một truy vấn mà chúng tôi xem xét theo chủ đề ở đây (nhưng hỏi cách giải quyết vấn đề vắng mặt bất kỳ sự thiên vị giải pháp hiện có thường là). Tôi cũng đã dọn sạch một số cuộc trò chuyện bình luận mà tôi cảm thấy bị làm mờ bởi các chỉnh sửa.

1
Dòng đó trông gần giống như những gì tôi nhận được khi tôi bắt đầu với một đường thẳng và thêm tiếng ồn perlin (hoặc đơn giản) vào nó (một vài quãng tám). Có thể là một khu vực để khám phá (Tôi đang tạo ra ánh sáng thay đổi theo thời gian động)
Richard Tingle

Câu trả lời:


15

Yêu cầu

  1. Bạn muốn nhiều đường dẫn từ A đến B.
  2. Bạn muốn làm việc trong không gian lưới, có lẽ đây là không gian gạch cho bộ phận phụ của bạn.
  3. Bạn không muốn đường dẫn đi qua, hoặc nó sẽ làm hỏng tiến trình trò chơi.
  4. Bạn muốn các đường dẫn trông hợp lý hữu cơ.

Sơ đồ Voronoi

Biểu đồ Voronoi là không gian, đồ thị phẳng:

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

Một điều tốt đẹp về chúng là cách bạn có thể sử dụng chúng để tạo các đường dẫn hữu cơ. Nếu bạn vẽ một đường thẳng từ trung tâm đến trung tâm, bạn sẽ nhận được một con đường khá khó đoán (đọc: không chính thống).

Cách tạo Sơ đồ Voronoi để sử dụng với hệ thống dựa trên ô xếp

Tạo một bản đồ có kích thước hợp lý, giả sử 128x128. Tạo ntọa độ lưới ngẫu nhiên (x, y) trong bản đồ và điền vào mỗi tọa độ một id / màu duy nhất. Tạo một danh sách cho màu đó và thêm ô bắt đầu vào đó; làm điều này cho mỗi màu.

Bây giờ bạn có những điểm màu độc đáo này trôi nổi trong một khoảng trống, nhưng bạn cần tạo toàn bộ đảo màu xung quanh chúng, với kết quả cuối cùng trông như vậy:

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

Để làm điều đó, chúng ta cần xem màu nào sở hữu mỗi ô trong bản đồ (ô = pixel trong hình trên). Chúng tôi chạy qua mọi ô trên bản đồ, kiểm tra nđiểm màu bắt đầu nào gần nhất với nó (thông qua pythagoras). Ô đó đi vào danh sách được liên kết với id / màu duy nhất đó ... sau đây được gọi là các ô AKA Voronoi (trong sơ đồ trên, các nhóm pixel có cùng màu).

Bây giờ bạn sẽ có một sơ đồ Voronoi được lượng tử hóa. Bước tiếp theo là phân tích sự phụ thuộc của từng đảo với các đảo khác. Thiết lập cấu trúc nút và cạnh đơn giản để bạn có thể lưu trữ biểu đồ (nút chỉ là id, danh sách cho id đó và danh sách các cạnh trống; cạnh chỉ là nút bắt đầu và kết thúc). Đối với mỗi đảo có id ided duy nhất, tạo một nút và thêm các cạnh để liên kết nó với mỗi đảo mà nó nằm liền kề.

Khi bạn có sơ đồ hoàn chỉnh (biểu đồ), bạn sẽ đến phần thú vị - sử dụng biểu đồ để tìm chuỗi đảo và bằng cách làm cho tất cả các ô trong mỗi đảo trong chuỗi có cùng một ID, bạn sẽ tạo ra một trong những con đường của bạn. Giả sử một hòn đảo có tất cả các ô có ID 503 nằm cạnh một hòn đảo có id 657. Bạn có thể thay thế tất cả 503 ô bằng ID 657, do đó tạo ra một đảo lớn hơn 657 liền kề.

Ví dụ: màu đỏ là đường dẫn 1, màu xanh là đường dẫn 2, màu đỏ là cả hai:

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

Bạn có thể sử dụng bất kỳ thuật toán đồ thị hiện có (bao gồm A *) để tạo các đường dẫn từ đầu đến cuối. Có được một con đường uốn khúc là một trường hợp không phải lúc nào cũng sử dụng bước tối ưu hướng tới đảo mục tiêu.

Cuối cùng, việc thu nhỏ các hòn đảo là chuyện nhỏ nếu bạn muốn các đường hẹp hơn hoặc sử dụng bản đồ lớn hơn với nhiều đảo hơn để có được độ phân giải tốt hơn.

Bước tùy chọn, cuối cùng, cho tìm đường

Bạn có thể sử dụng biểu đồ mức cao mà bạn đã tạo cùng với các ô / ô bên dưới để thực hiện thời gian chạy A *, HOẶC bạn có thể thực hiện Leo đồi trên các ô / ô bên dưới để chuyển động tốt hơn:

Tại tọa độ trung tâm (hoặc bất kỳ) của đảo mục tiêu của bạn, bạn có thể đặt một ô ảnh hưởng. Ảnh hưởng này có thể bơm ra "mùi hương" như trong Khuếch tán hợp tác . Mùi hương này sẽ lan tỏa khắp con đường trở về hòn đảo khởi đầu, ngày càng yếu đi khi nó đi. Bây giờ đối với một thực thể khi bắt đầu, chúng ta chỉ cần leo từ một tế bào có mùi thơm thấp hơn đến một tế bào có mùi thơm cao hơn, mỗi lần đưa bạn đến gần mục tiêu hơn - giống như cách một con chó vận hành. Mỗi đường dẫn gần như tuyến tính, điều này cho phép bạn tránh sử dụng A * khi chạy. Hoặc bạn có thể làm tương tự với biểu đồ đảo, nhưng cách đó phức tạp hơn một chút vì có thể bạn sẽ muốn điều hướng các thực thể của mình ở cấp độ xếp. Vì vậy, cách đầu tiên có lẽ tốt hơn. Dù bằng cách nào cũng sẽ cho phép bạn điều hướng đến mục tiêu với chi phí xử lý thấp.


Tôi đã tạo một trình tạo bản đồ bằng Voronoi và Perlin Noise trong Java, có thể nó có thể hữu ích cho bạn như một điểm khởi đầu: github.com/dragondgold/Map-Generator
Andres
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.