Yêu cầu
- Bạn muốn nhiều đường dẫn từ A đến B.
- 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.
- 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.
- 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:
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 n
tọ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:
Để 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:
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.