Page 1 of 1

Как предугадать направление движущегося персонажа ?

Posted: 17.03.2011 16:37
by Venom
Суть: при обнаружении интересующего объекта, бежать к нему и производить определенные действия.

Проблема:
при использовании-

Code: Select all

 NewMoveXY(GetX(enemy),GetY(enemy),true,0,true);
персонаж бежит на последнюю координату,
где находился искомый объект. Если объект на том же месте,
то производится какое либо действие, если нет,
то анализируем новое местоположение объекта
и бежим на его (объекта) координаты.
Но, в случае, если искомый объект постоянно перемещается,
такая функция - не подходит.

Можно ли как то анализировать последующие
координаты объекта и бежать к нему наперерез,
а не на те координаты, где он уже находился?

PS.
Пробовал через
If GetDirection(self)<>GetDirection(enemy) then NewMoveXY(GetX(GetDirection(enemy)),GetY(GetDirection(enemy)),true,0,true);
результат аналогичен предыдущему.

И каков отклик при перемещении к проанализированной координате ?

Posted: 17.03.2011 17:41
by Vizit0r
не беги через поиск пути.
получи массив точек пути до обьекта через GetPathArray, и через Step топай по ним. Перед каждым шагом или новый массив точек пути получай, или сверяй координаты обьекта с прошлыми (что быстрее) и только при изменении делай GetPathArray - как угодно.

Posted: 18.03.2011 7:01
by Fenix
Можно всё же попробовать бежать наперерез.
Через function GetDirection(ObjID: Cardinal): Byte получить направление движения объекта. Через function IsRunning(ObjID: Cardinal): Boolean узнаем бежит цель или нет. С учетом этого определяем приблизительную скорость движения объекта (сколько тайлов в секунду, но надо учитывать, что скорости разных мобов могут отличаться). Через векторную алгебру (с учетом своих способностей к бегу) определяем в какой точке мы нагоним цель и через GetPathArray выстраиваем к этой точке маршрут.
Правда после каждого шага всё равно придётся пересчитывать маршрут, чтобы убедиться, что цель не изменила направление движения и в случае необходимости пересчитать маршрут.
К тому же могут возникнуть проблемы, когда скорость цели равна собственной скорости, а двигается она точно от вас. В этом случае точка пересечения будет либо в бесконечности, либо очень далеко. Поэтому лучше предусмотреть в алгоритме ограничение по расстоянию до точки встречи. Если расчетное расстояние больше ограничения - назначаем точку всречи на вероятной траектории цели через пару десятков тайлов.

Posted: 18.03.2011 8:37
by Vizit0r
Fenix забыл уточнить, что все это применимо если по пути нет препятствий и их не надо учитывать - считай идеальные, лабораторные условия :)

Posted: 18.03.2011 19:20
by Venom
Вы конечно извините, но я - "тупо вареный" :)

Posted: 18.03.2011 20:15
by Fenix
Да, насчет препятствий я запамятовал малость.
Venom wrote:Вы конечно извините, но я - "тупо вареный" :)
На этот счет могу ответить лишь, что этот код я писать не собираюсь.