XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
NCrashed

offline
Опыт: 13,553
Активность:
[cJass] WayLib - система поиска пути по дорогам
Эта библиотека реализует знаменитый алгоритм A* поиска оптимального пути в варе. В отличие от стандартного pathing, моя система учитывает стоимость каждого вида местности. Юнит не побежит через поле, а пойдет через обходную дорогу. Также можно указать какие тайлы непроходимы.

Импорт

  1. Установить Jass New Gen Pack (JNGP) и cjass парсер от ADOLF.
  2. Скопировать триггер WayLib к себе на карту или (для продвинутых пользователей) импортировать скрипт через include.
  3. Опционально скопируйте триггер Poter к себе на карту

Использование

Чтобы просчитать путь, надо:
  1. Создать структуру Way:
myway = Way.Init()
  1. Вызвать функцию
myway.Calc(unit u, real tx, real ty)
,где u - ваш юнит tx,ty - координаты точки цели, которая находится на дороге.
  1. Обработать результат, который будет записан в хештаблицу myway.OpenList задом на перед. Инт. myway.k указывает на первый шаг в хештаблице (и явл. последним элементом хештаблицы)
В качестве примера обработки я написал доп. библиотеку Poter, пример ее использования можно посмотреть в триггере "DBPoter" и, собственно, следует посмотреть саму эту библиотеку.

Примечание

Система еще не релизная, считает все правильно, но долго из-за задержек. Без них происходит один большой лаг. В следующих версиях этого не будет, так как путь будет считаться сразу с 2х сторон и юзаться 2х уровневый pathing, +перейду на binary heaps ака бинарные кучи, они в 10 раз быстрее хештаблиц на длинных путях.
Прикрепленные файлы
Тип файла: w3x K&M waylib.w3x (70.1 Кбайт, 52 просмотров )
Тип файла: rar WayLib_Astar_0.3.rar (3.9 Кбайт, 35 просмотров )

Отредактировано NCrashed, 02.11.2009 в 14:58.
Старый 29.10.2009, 17:55
Rinegan

offline
Опыт: 895
Активность:
Может обход графа в ширину?
В глубину - это на ацикличность.
Старый 29.10.2009, 18:15
NCrashed

offline
Опыт: 13,553
Активность:
В глубину.
Старый 29.10.2009, 18:16
Rinegan

offline
Опыт: 895
Активность:
Чёт ты гонишь, нахождение наикратчайшего пути - это в ширину называеца.
Старый 29.10.2009, 18:17
NCrashed

offline
Опыт: 13,553
Активность:
Если представить точку начала пути за вершину графа, то это будет поиск в глубину.
Старый 29.10.2009, 18:19
Rinegan

offline
Опыт: 895
Активность:
Старый 29.10.2009, 18:20
NCrashed

offline
Опыт: 13,553
Активность:
Идеологический момент здесь не очень важен, оцените саму систему.
Старый 29.10.2009, 18:20
XOR

offline
Опыт: 38,159
Активность:
В длину. Ну а так норм, только немного неудобно твои системы собирать по отдельности) я так понимаю исключается возможности вылета за конец карты? И почему только с квадратными
Старый 29.10.2009, 18:22
Rinegan

offline
Опыт: 895
Активность:
Ок, ща посмотрю.
хотя всёже в ширину=)
Старый 29.10.2009, 18:22
NCrashed

offline
Опыт: 13,553
Активность:
Все убедил, поиск в ширину =). Не буду с тобой спорить.
NCrashed добавил:
XiMiKs, главная библиотека WayLib. А библиотека Poter нужна только для теста =). Ее конечно можно переделать под себя и использовать.
С квадратными легче вычислить номер тайла по координатам, иначе нужно писать собственную функцию для x и y координат. В итоге получим 4 функции вместо 2х. А так как неквадратные карты редко используются, то я упростил задачу.
NCrashed добавил:
Вылет за пределы проверяется.
Старый 29.10.2009, 18:26
Rinegan

offline
Опыт: 895
Активность:
Чёто у тебя всё так сложно написано. Не втом смысле, что сама задача сложная, а ты как-то её уж больно усложнил. Если ты не против, я попробую тоже самое написать?
Старый 29.10.2009, 18:30
NCrashed

offline
Опыт: 13,553
Активность:
Попробуй, задача на самом деле непростая, можно попытаться построить путь не циклом, а рекурсией, но я не стал так издеваться над своими (и пользовательскими) мозгами
Старый 29.10.2009, 18:32
Rinegan

offline
Опыт: 895
Активность:
Нет, рекурсия здесь будет очень долгой, если задача из одного края карты размером 480х480 перейти в другой. Здесь списком делать надо.
Rinegan добавил:
оО
Это что за изврат?!
    private int MOD(int a, int b) {
        int c
        if (b == 0) or ( a == 0) {return -1}
        while (a >= b) {
            a -= b 
        }
        return a
    }
Старый 29.10.2009, 18:37
NCrashed

offline
Опыт: 13,553
Активность:
инт с там лишнее, забыл удалить, это вычисление остатка от деления
Старый 29.10.2009, 18:52
Rinegan

offline
Опыт: 895
Активность:
ну ты извращенец.....
А DIV то зачем? стандартное деление 19/5 и есть div, и выдаст оно 3.
Rinegan добавил:
Во-первых это делается не циклом.
Во-вторых есть нормальная BJ функция ModuloInteger
function ModuloInteger takes integer dividend, integer divisor returns integer
Старый 29.10.2009, 18:54
NCrashed

offline
Опыт: 13,553
Активность:
Оно выдаст с дробной частью а при округлении можно получить не то значение, например при округлении 13.8
NCrashed добавил:
Не люблю бж функции, не доверяю я им, все равно также сделана
Старый 29.10.2009, 18:57
Rinegan

offline
Опыт: 895
Активность:
local integer i = 19/5
i будет равно 3
проверь сам.
Старый 29.10.2009, 18:58
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
Оно выдаст с дробной частью

пфффф олололол... n/c у интов есть дробная чясть...
Старый 29.10.2009, 19:00
Rinegan

offline
Опыт: 895
Активность:
ничё не также, она нормально сделана, проверь.
Старый 29.10.2009, 19:00
NCrashed

offline
Опыт: 13,553
Активность:
Ладно есть такая фича, но быстрее работает мой вариант. По-другому на аппаратном уровне не вычисляется. И вообще что ты придрался к этим двум функциям =) ? Див вроде там всего 1 раз используется.
NCrashed добавил:
В джаззе есть неявное приведение типов? 0_o
Старый 29.10.2009, 19:02
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 18:36.