Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

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

тут можно задать вопрос по скриптингу
Post Reply
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

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

Post 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);
результат аналогичен предыдущему.

И каков отклик при перемещении к проанализированной координате ?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

не беги через поиск пути.
получи массив точек пути до обьекта через GetPathArray, и через Step топай по ним. Перед каждым шагом или новый массив точек пути получай, или сверяй координаты обьекта с прошлыми (что быстрее) и только при изменении делай GetPathArray - как угодно.
Last edited by Vizit0r on 18.03.2011 8:36, edited 1 time in total.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

Можно всё же попробовать бежать наперерез.
Через function GetDirection(ObjID: Cardinal): Byte получить направление движения объекта. Через function IsRunning(ObjID: Cardinal): Boolean узнаем бежит цель или нет. С учетом этого определяем приблизительную скорость движения объекта (сколько тайлов в секунду, но надо учитывать, что скорости разных мобов могут отличаться). Через векторную алгебру (с учетом своих способностей к бегу) определяем в какой точке мы нагоним цель и через GetPathArray выстраиваем к этой точке маршрут.
Правда после каждого шага всё равно придётся пересчитывать маршрут, чтобы убедиться, что цель не изменила направление движения и в случае необходимости пересчитать маршрут.
К тому же могут возникнуть проблемы, когда скорость цели равна собственной скорости, а двигается она точно от вас. В этом случае точка пересечения будет либо в бесконечности, либо очень далеко. Поэтому лучше предусмотреть в алгоритме ограничение по расстоянию до точки встречи. Если расчетное расстояние больше ограничения - назначаем точку всречи на вероятной траектории цели через пару десятков тайлов.
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

Fenix забыл уточнить, что все это применимо если по пути нет препятствий и их не надо учитывать - считай идеальные, лабораторные условия :)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post by Venom »

Вы конечно извините, но я - "тупо вареный" :)
Fenix
Developer
Developer
Posts: 275
Joined: 24.08.2010 7:20
Location: Ставрополь
Contact:

Post by Fenix »

Да, насчет препятствий я запамятовал малость.
Venom wrote:Вы конечно извините, но я - "тупо вареный" :)
На этот счет могу ответить лишь, что этот код я писать не собираюсь.
Помните – ничто так не защищает ваши зубы 12 часов днем и 12 часов ночью как уважительное отношение к окружающим.
"Многие из вас знакомы с достоинствами программиста. Их всего три, и разумеется это: лень, нетерпеливость и гордыня"© Larry Wall
Post Reply