2D-трафік - пошук гладких шляхів


10

Я намагався здійснити просту обробку шляху, але результат менш задовільний, ніж те, що я мав на меті досягти. Річ у тому, що одиниці в таких іграх, як Starcraft 2, рухаються в усіх напрямках, тоді як одиниці в моєму випадку рухаються не більше ніж в 8 напрямках (стиль Warcraft 1), оскільки ці 8 напрямків спрямовані до наступних доступних вузлів (вони переміщуються від плитки до наступної сусідньої плитки) . Що мені робити, щоб досягти результату, як у Starcraft 2? Зменшити розмір плитки?

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

На малюнку видно горизонтальну лінію скельних плиток, яка є перешкодами, а знайдений шлях позначений зеленими плитками. Червона лінія - це шлях, який я хочу досягти.


Я величезний шанувальник пошуку точки стрибка, хоча я ще не знайшов часу для його здійснення. Але документація була цікавою і має хороші показники.

2
Ви впевнені, що це ваш бажаний шлях? Вузли, які використовують його, частково пройдуть через стіни. Я зробив це більш помітним на іншому прикладі: i.imgur.com/eh4ZR.png І ось чого ви, мабуть, дійсно хочете досягти: i.imgur.com/vFQg4.png
Маркус фон Броаді

Ви маєте рацію. Мій шлях був хибним, але це було скоріше для ілюстрації. Дякує за вказівку на кращий спосіб заглянути.
Kooi Nam Ng

Для отримання того, що потрібно, вам доведеться мати дробові координати всередині плитки. Жоден можливий шлях без цього не спрацює - перенесення дробів, але не відображення їх, змусить ваш пристрій рухатися прямо / по діагоналі / прямо / по діагоналі.
Лорен Печтел

@LorenPechtel ви неправі, ви можете згладити шлях, знайшовши його. Це досить просто, оскільки ви створюєте дві лінії, виходячи з розмірів одиниці, і перевіряйте, чи перетинаються вони з плитками між плиткою0 і плиткоюN, де плитка1-плитка (N-1) - це плитки, які ви хочете видалити зі шляху.
Маркус фон Броаді

Відповіді:


8

Для хорошого алгоритму просування маршруту використання A *, ймовірно, було б хорошою ідеєю, однак, для простої гри, яка не вимагає складного, ефективного та ефективного пошуку шляху, просто змусивши персонажів рухатися до цілі, з’ясовуючи напрямок цілі має бути достатнім.

Ви можете зробити генерувати "графік видимості" (які інші точки видно з кожної точки) з вершин, а потім виконати A * на графіку. Це працює, тому що найкоротший шлях завжди буде лежати на графіку видимості.

Зменшення розміру плитки може вам допомогти.

Ресурси

Подальше читання

EDIT: Мені подобається коментар @ MarkusvonBroady.

"мова йде саме про згладжування шляху, а не про пошук. Шлях, знайдений на малюнку, виглядає нормально."

Ресурси

Від @MarkusvonBroady

Я здійснив пошук, знайдіть підписки (вони можуть вам допомогти)


1
чудові посилання, +1 від мене
lhk

2
@MarkusvonBroady, спасибі за -1 Я дізнався від вас. Я не хочу точку, скоріше я готовий вчитися та ділитися правильним. Я вірю, обговорюючи, що ми можемо знайти правильний. :)
Md Mahbubur Rahman

@MarkusvonBroady, будь ласка, поділіться кількома ресурсами алгоритму згладжування шляху?
Md Mahbubur Rahman

Власне, я думаю, що ця відповідь допомагає ОП. Я не думаю, що ОП запитувало про фактичне згладжування (сплайпова інтерполяція тощо), але скоріше, щоб його алгоритм знаходив жахливий неоптимальний шлях і його потрібно «згладити» в більш пряму лінію. Який A *, природно, знайшов би для нього без додаткового згладжування.
Шон Міддлічч

Я використовував A * і, думаю, знайшов оптимальний шлях.
Kooi Nam Ng

0

Починаючи з одного кінця необробленого шляху, скажімо path[0], ви можете видалити, path[1]якщо відрізок, утворений приєднанням до точок path[0]і path[2]НЕ перетинає жодну стіну. Якщо пройти далі, поки останній відрізок не забезпечить простіший шлях.

Це не тільки згладить шлях, але й видалить деякі непотрібні точки, як, наприклад, вогонь, 3 послідовні відрізки прямої лінії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.