2D pathfinding - menemukan jalur halus

10

Saya mencoba menerapkan pathfinding sederhana, tetapi hasilnya kurang memuaskan daripada apa yang ingin saya capai. Masalahnya adalah unit dalam game seperti Starcraft 2 bergerak ke segala arah sedangkan unit dalam kasus saya hanya bergerak paling banyak 8 arah (gaya Warcraft 1) karena 8 arah ini mengarahkan ke node yang tersedia berikutnya (mereka bergerak dari ubin ke ubin tetangga berikutnya) . Apa yang harus saya lakukan untuk mencapai hasil seperti di Starcraft 2? Kecilkan ukuran ubin?

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

Pada gambar Anda dapat melihat garis horizontal ubin batu menjadi penghalang, dan jalur yang ditemukan ditandai sebagai ubin hijau. Garis merah adalah jalan yang ingin saya capai.

Kooi Nam Ng
sumber
Saya penggemar berat pencarian titik lompat walaupun saya belum menemukan waktu untuk mengimplementasikannya. Namun dokumentasinya menarik dan memiliki kinerja yang baik.
2
Apakah Anda yakin itu jalan yang Anda inginkan? Unit yang menggunakannya sebagian akan melewati dinding. Saya membuatnya lebih terlihat dalam contoh lain: i.imgur.com/eh4ZR.png Dan inilah yang mungkin ingin Anda capai: i.imgur.com/vFQg4.png
Markus von Broady
Anda benar. Jalan saya cacat, tetapi lebih untuk tujuan ilustrasi. Terima kasih telah menunjukkan cara yang lebih baik untuk melihat.
Kooi Nam Ng
Anda harus memiliki koordinat fraksional dalam ubin untuk mendapatkan yang Anda inginkan. Tidak ada jalan yang mungkin tanpa ini akan berhasil - membawa pecahan tetapi tidak menampilkannya akan membuat unit Anda bergerak lurus / diagonal / lurus / diagonal.
Loren Pechtel
@ LorenPechtel Anda salah, Anda dapat memuluskan jalannya setelah menemukannya. Ini cukup mudah ketika Anda membuat dua garis berdasarkan dimensi unit, dan memeriksa apakah mereka berpotongan dengan ubin antara tile0 dan tileN, di mana tile1-tile (N-1) adalah ubin yang ingin Anda hapus dari jalur.
Markus von Broady

Jawaban:

8

Untuk algoritma penelusuran jalur yang baik, menggunakan A * mungkin akan menjadi ide yang bagus, namun, untuk permainan sederhana yang tidak memerlukan penelusuran jalur yang canggih, efisien, atau efektif, cukup minta karakter bergerak menuju target dengan mencari tahu arah dari target harus memadai.

Yang dapat Anda lakukan adalah menghasilkan 'grafik visibilitas' (titik-titik apa yang terlihat dari setiap titik) dari simpul dan kemudian melakukan A * pada grafik. Ini berfungsi karena jalur terpendek akan selalu terletak pada grafik visibilitas.

Mengecilkan ukuran ubin dapat membantu Anda.

Sumber daya

Bacaan lebih lanjut

EDIT: Saya suka komentar @ MarkusvonBroady.

"Sebenarnya ini tentang penghalusan jalur, bukan penemuan. Jalur yang ditemukan pada gambar terlihat OK."

Sumber daya

Dari @MarkusvonBroady

Saya telah melakukan pencarian, menemukan yang berikut (yang dapat membantu Anda)

Md Mahbubur Rahman
sumber
1
tautan bagus, +1 dari saya
lhk
2
@MarkusvonBroady, Terima kasih atas -1. Saya telah belajar dari Anda. Saya tidak ingin poin, tapi saya mau belajar dan membagikan yang benar. Saya percaya dengan mendiskusikan kita dapat menemukan yang tepat. :)
Md Mahbubur Rahman
@MarkusvonBroady, maukah Anda berbagi beberapa sumber daya algoritma smoothing path?
Md Mahbubur Rahman
Sebenarnya, saya pikir jawaban ini membantu OP. Saya tidak berpikir OP meminta smoothing sebenarnya (interpolasi spline atau sejenisnya) melainkan bahwa algoritma-nya saat ini menemukan jalur yang tidak optimal yang mengerikan dan perlu "dihaluskan" menjadi garis yang lebih lurus. A * yang secara alami akan ditemukan untuknya tanpa pemulusan tambahan.
Sean Middleditch
Saya telah menggunakan A * dan saya pikir saya telah menemukan jalur optimal.
Kooi Nam Ng
0

Mulai dari salah satu ujung jalur mentah, katakanlah path[0], Anda dapat menghapus path[1]jika segmen terbentuk dengan menggabungkan titik-titik path[0]dan path[2]TIDAK memotong dinding apa pun. Melangkah lebih jauh hingga segmen terakhir akan memberikan jalur yang lebih sederhana.

Ini tidak hanya akan memperlancar jalur tetapi juga menghilangkan beberapa titik yang tidak berguna, seperti contoh api, 3 segmen garis lurus.

arainone
sumber