Tìm đường 2D - tìm đường trơn


10

Tôi đã cố gắng thực hiện một tìm đường đơn giản, nhưng kết quả không thỏa đáng hơn những gì tôi dự định đạt được. Vấn đề là các đơn vị trong các trò chơi như Starcraft 2 di chuyển theo mọi hướng trong khi các đơn vị trong trường hợp của tôi chỉ di chuyển theo tối đa 8 hướng (kiểu Warcraft 1) vì 8 hướng này trực tiếp đến các nút có sẵn tiếp theo (chúng di chuyển từ ô này sang ô kế tiếp) . Tôi nên làm gì để đạt được kết quả như trong Starcraft 2? Thu nhỏ kích thước gạch?

http://i.stack.imgur.com/lr19c.jpg

Trên hình ảnh, bạn có thể thấy một đường ngang của gạch đá là chướng ngại vật và đường dẫn được tìm thấy được đánh dấu là gạch màu xanh lá cây. Đường màu đỏ là con đường tôi muốn đạt được.


Tôi là một fan hâm mộ lớn của tìm kiếm điểm nhảy mặc dù tôi chưa tìm thấy thời gian để thực hiện nó. Nhưng tài liệu này rất thú vị và có hiệu suất tốt.

2
Bạn có chắc chắn đó là con đường mong muốn của bạn? Các đơn vị sử dụng nó sẽ một phần đi qua các bức tường. Tôi đã làm cho nó rõ hơn trong một ví dụ khác: i.imgur.com/eh4ZR.png Và đây là những gì bạn có thể thực sự muốn đạt được: i.imgur.com/vFQg4.png
Markus von Broady

Bạn đã đúng. Con đường của tôi rất thiếu sót, nhưng nó không chỉ nhằm mục đích minh họa. Cảm ơn đã chỉ ra cách tốt hơn để xem xét.
Kooi Nam Ng

Bạn sẽ phải có tọa độ phân số trong một ô để có được những gì bạn muốn. Không có con đường nào khả thi nếu không có cái này sẽ hoạt động - mang các phân số nhưng không hiển thị chúng sẽ khiến đơn vị của bạn di chuyển thẳng / chéo / thẳng / chéo.
Loren Pechtel

@LorenPechtel bạn sai rồi, bạn có thể thông suốt con đường sau khi tìm được. Thật dễ dàng khi bạn tạo hai dòng dựa trên kích thước của đơn vị và kiểm tra xem chúng có giao nhau với các ô giữa gạch0 và gạchN hay không, trong đó gạch1-gạch (N-1) là các ô bạn muốn xóa khỏi đường dẫn.
Markus von Broady

Câu trả lời:


8

Đối với thuật toán tìm đường tốt, sử dụng A * có thể là một ý tưởng hay, tuy nhiên, đối với một trò chơi đơn giản không yêu cầu tìm kiếm đường dẫn tinh vi, hiệu quả và hiệu quả, chỉ cần các nhân vật di chuyển về phía mục tiêu bằng cách tìm ra hướng của mục tiêu phải là đủ.

Bạn có thể làm là tạo một 'biểu đồ khả năng hiển thị' (những điểm khác có thể nhìn thấy từ mỗi điểm) từ các đỉnh và sau đó thực hiện A * trên biểu đồ. Điều này hoạt động vì đường dẫn ngắn nhất sẽ luôn nằm trên biểu đồ khả năng hiển thị.

Thu nhỏ kích thước gạch có thể giúp bạn.

Tài nguyên

Đọc thêm

EDIT: Tôi thích bình luận của @ MarkusvonBroady.

"nó thực sự là về làm mịn đường dẫn, không tìm thấy. Đường dẫn tìm thấy trên hình có vẻ ổn."

Tài nguyên

Từ @MarkusvonBroady

Tôi đã thực hiện tìm kiếm, tìm các mục sau (những thứ này có thể giúp bạn)


1
liên kết tuyệt vời, +1 từ tôi
lhk

2
@MarkusvonBroady, Cảm ơn -1. Tôi đã học được từ bạn. Tôi không muốn quan điểm, thay vào đó tôi sẵn sàng học hỏi và chia sẻ đúng. Tôi tin rằng bằng cách thảo luận chúng ta có thể tìm thấy đúng. :)
Md Mahbubur Rahman

@MarkusvonBroady, bạn có thể chia sẻ một số tài nguyên của thuật toán làm mịn đường dẫn không?
Md Mahbubur Rahman

Trên thực tế, tôi nghĩ rằng câu trả lời này sẽ giúp OP. Tôi không nghĩ OP đã yêu cầu làm mịn thực tế (nội suy spline hay tương tự) mà là thuật toán của anh ta hiện đang tìm một đường dẫn không tối ưu khủng khiếp và cần được "làm mịn" thành một đường thẳng hơn. Mà A * tự nhiên sẽ tìm thấy cho anh ta mà không cần làm mịn thêm.
Sean Middleditch

Tôi đã sử dụng A * và tôi nghĩ rằng tôi đã tìm thấy con đường tối ưu.
Kooi Nam Ng

0

Bắt đầu từ một đầu của đường dẫn thô, giả sử path[0], bạn có thể xóa path[1]nếu đoạn được hình thành bằng cách nối các điểm của path[0]path[2]KHÔNG giao với bất kỳ bức tường nào. Đi xa hơn cho đến đoạn cuối cùng sẽ cung cấp một con đường đơn giản hơn.

Điều này sẽ không chỉ làm trơn tru đường dẫn mà còn loại bỏ một số điểm vô dụng, như ví dụ lửa, 3 đoạn liên tiếp của một đường thẳng.

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.