![]() |
Подсветка всех доступных клеток для хода
Путь ищется по алгоритму AStar и клетки по которым должен пройти юнит кидаются в массив. А как подсветить все возможные для хода клетки?
|
Можно применить к ним один из фильтров.
|
Я не про саму подсветку ))) Я про алгоритм выбора клеток для подсветки.
|
Вы же сказали:
Цитата:
Добавлено через 1 минуту А... я не о том. Пардон. Добавлено через 3 минуты Вы хотите подсветить все проходимые клетки? |
Цитата:
|
Погодите-ка, а разве вы не сообщаете изначально какие клетки являются проходимыми, а какие нет? Или я чего-то не понимаю?
|
Не, послушайте. Каждый юнит может ходить только на определённое количество клеток. Нужно подсветить все клетки на которые может пойти юнит от его ТЕКУЩЕЙ клетки, при этом учитывая на сколько клеток он может ходить.
Один путь я могу подсветить. Ну вариантов на какую клетку может пройти юнит много, мне то и надо это поймать. |
У Вас же в A* должна быть функция, которая просчитывает возможные варианты хода с конктретной клетки.
Либо модифицируйте алгоритм, что бы он складывал в массивы {текущая клетка:[вариант1,2,3]} Либо вызывайте эту функцию просчета возможных ходов каждый раз, когда меняется активная клетка А потом применяйте фильтры к найденным клеткам |
У меня А* находит наилучший путь и он мне возвращает этот путь (массив). По которому я прогоняю моего юнита. Можете пожалуйста подробней объяснить, я совсем не понимаю.
|
Ну а что тебе мешает переделать этот самый Astar не для поиска пути до конкретной клетки, а для поиска проходимых клеток по пути не больше n от начальной клетки поиска?
Сам астар я реализовать не пробовал и не знаю точных различий с алгоритмом ли (последний, вроде как, частный случай первого), но в ли это легко делается. (просто завершаем алгоритм, когда клетки кончились доступные для поиска и возвращаем все пройденные). Не думаю, что в астаре сильно сложнее. |
насколько я понял имеется в виду след ситуация:
карта может выглядеть как Код AS1/AS2:
Необходимо подсветить проходимые пути - в данном случае влево и вправо-вниз, и подсветить именно по три клетки в данном направлении, при этом клетки сверху и сверху справа учитываться не должны, я правильно понял? |
Волновой алгоритм (для сетки называется ещё алгоритмом Ли) вас спасёт.
Вообще это упрощённый а*, вообще не пойму как осилив а* не догадаться про волновой. |
Я не осиливал А*, я просто взял готовый алгоритм для AS3. Я пользуюсь только массивом клеток (путь), который он возвращает.
Цитата:
|
Честно говоря сложно посоветовать в данном случае что то, не зная конечной задачи, т.к. все упирается в ресурсоемкость.
Не совсем понятно для чего Вы использовали А* если персонаж обладает свободой воли и будет искать путь с помощью игрока или какого то другого фактора? В этом случае использование А* неоправданно, т.к. с каждым перемещением перса Вам придется заново искать оптимальный путь из той точки, куда он попал. А* нужен для независимых перемещений объектов (выбрал зерга, нажал атаковать туда, и он побежал, просчитав дорогу.). Помимо этого существуют кучи оптимизаций, например, составить сетку 10х10 изо всей карты, проверить сквозную проходимость клеток (учитывая мосты, горы и реки), когда зерг достигает следующей клетки, брать эту клетку, делить её 100х100, находить путь уже там учитывая нахождение протоссов и т.п. В вашем случае, если это что пошаговое, придется скорее всего реализовывать алгоритм Флойда (вычислять стоимость путей из каждой клетки сетки в каждую), он отработает один раз. После этого как только персонаж попал на клетку, подсвечивать окружающие клетки, стоимость перемещения по которым не превышает длины его хода, при этом учитывая возможность перемещения перса из текущей клетки в запланированную. Мб, есть путь легче и проще, но, в моем понимании задачи, задача сложная |
У меня пошаговая игра. Стратегия. С одной стороны танки и с другой. (свои, враги). Просто выбираем юнита и говорим идти или атаковать и всё. Мне нужно понять как подсветить все доступные для хода клетки, исходя из того на сколько клеток может ходить юнит.
|
Да тупо там думаю - стал на точку, из точки пустил волну. Волна дальше длины хода не идёт.
Волновой алгоритм же тупой как пробка - идём из исходной клетки во все соседи. Из соседей потом тоже (но в пройденные не идём). Повторить нужное число шагов. |
Тогда Флойд
либо прогонять волновой несколько раз для каждого юнита или самое простое решение: при создании карты (создании руками, в процессе разработки) делать массив [клетка_сетки = [возможные_пути_с_этой_клетки] ], а потом тупо подсвечивать клетки из этого массива длиной хода танка. Такой подход займет больше времени при разработке и не универсален (для каждой карты придется делать свой массив), зато будет гораздо быстрее работать и без адских алгоритмов. |
А что обязательно волновой, с AStar не получится ? :-(
|
А* курочить надо, а если Вы его не реализовывали сами то вы ой как напоретесь с ним
|
Спасибо, понятно в общем. Положение не из лучших.
|
| Часовой пояс GMT +4, время: 04:21. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.