![]() |
Как определить пересечение пути юнита с определенным объектом?
Вопрос к тем, кто сталкивался с подобной проблемой (скорее всего к тем, кто делал стратегии).
Посылаю юнит в какую-то точку на карте. Кратчайший путь по умолчанию по прямой, но необходимо определить, будет ли пересечение этого пути с любым зданием на карте. Пытаюсь использовать LinеPick, проблема в том, что данная функция выдает только первый объект на пути, а это может быть и не здание, другой юнит, а вот за этим юнитом то самое здание и прячется. Пытался сделать пошагово, то есть если найден юнит, то далее ищем от него уже и т.д., но есть другая проблема у LinеPick - возващает иногда сам объект, от которого проверяешь путь. То есть он сам себе преграда. Как вариант постараться решить задачу с помощью геометрии, но тут не силен. Может есть у кого подсказки, алгоритмы и т.д., могущие помочь в решении задачи? |
Ответ: Как определить пересечение пути юнита с определенным объектом?
Цитата:
|
Ответ: Как определить пересечение пути юнита с определенным объектом?
Легко.
Перед проверкой лайнпиком выставляй у всех объектов кроме зданий и уровня EntityPickMode равным 0. А после проверки возвращай им их типы пика назад. Пример с юнитами: For u.Unit=Each Unit EntityPickMode u\mesh,0 Next If LinePick ... Then ... For u.Unit=Each Unit EntityPickMode u\mesh,2 (пик по полигонам) Next |
Ответ: Как определить пересечение пути юнита с определенным объектом?
В стратегиях используется поиск пути, а не пики
|
Ответ: Как определить пересечение пути юнита с определенным объектом?
именно это я и имел в виду. Пики занимают промежутончое состояние между физическим миром (который в игре, разумеется тоже представлен мат.моделями) и чистой логикой, оперирующей абстрактными объектами и алгоритмами дискретной математики.
Поставленная же задача, относится к логике юнитов. |
Re: Как определить пересечение пути юнита с определенным объектом?
2 Amatsu
Это было понятно с самого начала, но это называется "решить проблему через ж@пу" :) Пока у меня рука не поднимется реализовать подобное, это крайний случай. 2 tormoz & impersonalis Про поиск пути в курсе, но у меня стратегия не обычная, карта практически пуста, и населена только движущимися объектами (если видели demo Woodcutters поймете), поэтому в 99% юнит просто идет прямо. В данном случае пока загружать игру логикой поиска пути не вижу смысла, делаю через waypoint-ы зданий, осталось только понять, встретится здание на пути или нет (так на мой взгляд гораздо проще в данной ситуации, чем создавать логическую карту местности и искать на ней путь с помощью какого-нибудь громоздкого алгоритма, с которым еще разобраться надо). Может это возможно решить геометрически, с помощью написанной процедуры поиска пересечения линии и квадрата (здания), но подобными процедурами не обладаю, и геометрию уже напрочь забыл. Или все таки решить как-нибудь через LinePick, но там я как уже написал невозможно создать рекурсивную функцию, потому что LinePick при поиске от координат юнита иногда на этом же юните и зацикливается :( |
Ответ: Как определить пересечение пути юнита с определенным объектом?
:4to: Почему это через ж@пу? Проверенно, работает, не тормозит. Странно... Если хочешь извращаться, делай рекурсивно или как ты там хочешь
p.s. а вообще юзай вместо лайнпика рейкасты физикса, если ты так заботишься о производительности =) |
Re: Как определить пересечение пути юнита с определенным объектом?
2 Amatsu
Понятно, что это работает и все такое. Просто это через ж@пу, потому что EntityPickMode предназначена для того, чтобы определить один раз тип пика объекту и все, а не с его помощью искать LinePick-ом какой-то объект, постоянно убирая и назначая EntityPickMode :) А до физикса я не дорос, да и времени расти нету :( |
Ответ: Как определить пересечение пути юнита с определенным объектом?
EntityPickMode вообще по идее просто выставляет флаг объекту, каким макаром его потом пикать и пикать ли вообще. Это коллизию лучше не переназначать, иначе во время смены в главном цикле объекты начинает колбасить и у них пропадает местами коллизия вообще. Но дело твое.
|
Ответ: Как определить пересечение пути юнита с определенным объектом?
Между прочим, Amatsu прав.
Такая вещь Код:
Цитата:
|
Re: Как определить пересечение пути юнита с определенным объектом?
Ну про ж@пу я так понимаю у каждого свое сугубо личное представление, думаю, не стоит на ней заострять внимание.
А вот наши разговоры по поводу EntityPickMode навели меня на мысль. В итоге вместо постоянного снятия всех пиков совсех объектов я в рекурсии снимаю только с необходимого и проверяю дальше. Мне кажется, это уже оригинально, и совсем не ж@па :) Код:
Function PositionWayPoint(point,waypoint,px#,pz#,x#,z#,radius#) |
Ответ: Как определить пересечение пути юнита с определенным объектом?
Так-то ничего страшного в снятии пикмода нет, даже если у тебя... сотни юнитов.
Если чисто геометрически, я делаю пик под землей )) , там нет юнитов, а здания можно и под землю немного опустить. Так вообще можно сделать несколько как бы уровней пиков, тупо по высоте, надеюсь автор поймет о чем речь ) |
Re: Как определить пересечение пути юнита с определенным объектом?
2 Damp
Да, понимаю, я так пробовал уже, но это все таки не геометрическое решение, а подобное, ага. |
Ответ: Re: Как определить пересечение пути юнита с определенным объектом?
Цитата:
|
Re: Как определить пересечение пути юнита с определенным объектом?
2 Amatsu
Не, ну тут вопрос риторический, конечно, пока кто-нибудь замеров не сделает, нельзя сказать, насколько LinePick больше или меньше занимает времени, чем пробег по всем объектам 2 раза (а этих объектов опять таки может быть и 10 и 100). Только имей ввиду, что 10 объектов на пути LinePick могут встретиться за игру 1-2 раза всего, могут вообще не встретиться. А вот по сотням объектов в вашем случае придется бегать каждый раз постоянно, следовательно, это постоянный нагруз на игру. Я вот из такой логики исхожу. Плюс по идее LinePick не должен напрягать ресурсы - там по сути в логике функции должна браться прямая, и в цикле по объектам проверяться принадлежность объектов этой прямой. В итоге тот же пробег по объектам, только всего один раз. Но это чистая теория, конечно. |
Часовой пояс GMT +4, время: 20:09. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot