Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Подсветка всех доступных клеток для хода (http://www.flasher.ru/forum/showthread.php?t=147075)

FlashWizard 25.11.2010 14:46

Подсветка всех доступных клеток для хода
 
Путь ищется по алгоритму AStar и клетки по которым должен пройти юнит кидаются в массив. А как подсветить все возможные для хода клетки?

bav 25.11.2010 14:49

Можно применить к ним один из фильтров.

FlashWizard 25.11.2010 15:08

Я не про саму подсветку ))) Я про алгоритм выбора клеток для подсветки.

bav 25.11.2010 15:10

Вы же сказали:
Цитата:

клетки по которым должен пройти юнит кидаются в массив
Если вы имели в виду ссылки на клетки, то я не вижу проблемы. Если вы имели в виду координаты клеток, то сохраняйте еще и ссылки.

Добавлено через 1 минуту
А... я не о том. Пардон.

Добавлено через 3 минуты
Вы хотите подсветить все проходимые клетки?

FlashWizard 25.11.2010 15:15

Цитата:

Вы хотите подсветить все проходимые клетки?
Именно

bav 25.11.2010 15:32

Погодите-ка, а разве вы не сообщаете изначально какие клетки являются проходимыми, а какие нет? Или я чего-то не понимаю?

FlashWizard 25.11.2010 15:39

Не, послушайте. Каждый юнит может ходить только на определённое количество клеток. Нужно подсветить все клетки на которые может пойти юнит от его ТЕКУЩЕЙ клетки, при этом учитывая на сколько клеток он может ходить.

Один путь я могу подсветить. Ну вариантов на какую клетку может пройти юнит много, мне то и надо это поймать.

leofit 25.11.2010 15:39

У Вас же в A* должна быть функция, которая просчитывает возможные варианты хода с конктретной клетки.
Либо модифицируйте алгоритм, что бы он складывал в массивы {текущая клетка:[вариант1,2,3]}
Либо вызывайте эту функцию просчета возможных ходов каждый раз, когда меняется активная клетка
А потом применяйте фильтры к найденным клеткам

FlashWizard 25.11.2010 15:46

У меня А* находит наилучший путь и он мне возвращает этот путь (массив). По которому я прогоняю моего юнита. Можете пожалуйста подробней объяснить, я совсем не понимаю.

ChuwY 25.11.2010 15:52

Ну а что тебе мешает переделать этот самый Astar не для поиска пути до конкретной клетки, а для поиска проходимых клеток по пути не больше n от начальной клетки поиска?

Сам астар я реализовать не пробовал и не знаю точных различий с алгоритмом ли (последний, вроде как, частный случай первого), но в ли это легко делается.
(просто завершаем алгоритм, когда клетки кончились доступные для поиска и возвращаем все пройденные).
Не думаю, что в астаре сильно сложнее.

leofit 25.11.2010 16:32

насколько я понял имеется в виду след ситуация:

карта может выглядеть как
Код AS1/AS2:

    1 1 1 1 1 1 1 1 1 x
    1 0 0 0 1 0 0 0 0 0
    1 0 0 0 0 0 1 0 0 0
    1 0 0 1 P 0 0 0 0 0
    1 1 1 1 0 1 1 0 0 0
    0 0 0 0 0 0 1 0 0 0

где P позиция перса, x - конечная точка, 0 - клетки на которые нельзя ходить, 1 - на которые можно. Допустим данный перс может ходить на три клетки

Необходимо подсветить проходимые пути - в данном случае влево и вправо-вниз, и подсветить именно по три клетки в данном направлении, при этом клетки сверху и сверху справа учитываться не должны, я правильно понял?

-De- 25.11.2010 16:38

Волновой алгоритм (для сетки называется ещё алгоритмом Ли) вас спасёт.
Вообще это упрощённый а*, вообще не пойму как осилив а* не догадаться про волновой.

FlashWizard 26.11.2010 15:15

Я не осиливал А*, я просто взял готовый алгоритм для AS3. Я пользуюсь только массивом клеток (путь), который он возвращает.

Цитата:

Необходимо подсветить проходимые пути - в данном случае влево и вправо-вниз, и подсветить именно по три клетки в данном направлении, при этом клетки сверху и сверху справа учитываться не должны, я правильно понял?
Да так. Не объясните ?

leofit 26.11.2010 15:47

Честно говоря сложно посоветовать в данном случае что то, не зная конечной задачи, т.к. все упирается в ресурсоемкость.
Не совсем понятно для чего Вы использовали А* если персонаж обладает свободой воли и будет искать путь с помощью игрока или какого то другого фактора? В этом случае использование А* неоправданно, т.к. с каждым перемещением перса Вам придется заново искать оптимальный путь из той точки, куда он попал.

А* нужен для независимых перемещений объектов (выбрал зерга, нажал атаковать туда, и он побежал, просчитав дорогу.). Помимо этого существуют кучи оптимизаций, например, составить сетку 10х10 изо всей карты, проверить сквозную проходимость клеток (учитывая мосты, горы и реки), когда зерг достигает следующей клетки, брать эту клетку, делить её 100х100, находить путь уже там учитывая нахождение протоссов и т.п.

В вашем случае, если это что пошаговое, придется скорее всего реализовывать алгоритм Флойда (вычислять стоимость путей из каждой клетки сетки в каждую), он отработает один раз. После этого как только персонаж попал на клетку, подсвечивать окружающие клетки, стоимость перемещения по которым не превышает длины его хода, при этом учитывая возможность перемещения перса из текущей клетки в запланированную.
Мб, есть путь легче и проще, но, в моем понимании задачи, задача сложная

FlashWizard 26.11.2010 16:00

У меня пошаговая игра. Стратегия. С одной стороны танки и с другой. (свои, враги). Просто выбираем юнита и говорим идти или атаковать и всё. Мне нужно понять как подсветить все доступные для хода клетки, исходя из того на сколько клеток может ходить юнит.

-De- 26.11.2010 16:27

Да тупо там думаю - стал на точку, из точки пустил волну. Волна дальше длины хода не идёт.
Волновой алгоритм же тупой как пробка - идём из исходной клетки во все соседи. Из соседей потом тоже (но в пройденные не идём). Повторить нужное число шагов.

leofit 26.11.2010 16:30

Тогда Флойд
либо прогонять волновой несколько раз для каждого юнита
или самое простое решение:
при создании карты (создании руками, в процессе разработки) делать массив [клетка_сетки = [возможные_пути_с_этой_клетки] ], а потом тупо подсвечивать клетки из этого массива длиной хода танка. Можно также предусмотреть, что при гибели танка на какой то клетке эта клетка становится непроходимой и из массива динамически убирается. (не подумал что пересчет проходимости делать придется)
Такой подход займет больше времени при разработке и не универсален (для каждой карты придется делать свой массив), зато будет гораздо быстрее работать и без адских алгоритмов.

FlashWizard 26.11.2010 16:37

А что обязательно волновой, с AStar не получится ? :-(

leofit 26.11.2010 16:40

А* курочить надо, а если Вы его не реализовывали сами то вы ой как напоретесь с ним

FlashWizard 27.11.2010 02:23

Спасибо, понятно в общем. Положение не из лучших.


Часовой пояс GMT +4, время: 04:21.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.