Условия "расстояние между" и "повернут на объект"
|
|
Rikushi | Дата: Суббота, 18 Июля 2015, 16:32 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Приветствую господа.
Возникли трудности при написании комплексного поведения для ИИ.
Собственно встала такая неразрешимая для меня задача:
1. Необходимо узнать расстояние между двумя объектами (хоть в пикселях, хоть в попугаях). Т.е. результатом должно быть условие: Если расстояние между А и B >/</= N, то... Объекты А и B при этом могут находиться абсолютно на любых x,y. Необходимо расстояние по прямой. При этом lOS использовать нет возможности (он уже задействован для другого). Ситуация усугубляется тем, что объектов Б может быть неограниченное количество, т.е. просто через переменную и дистанс(А,Б) задачу не решить.
Чтобы стало понятнее, расскажу пример применения: Допустим игра жанра - топ даун шутор. Есть вражеские объекты, которые умеют двигаться и стрелять. Необходимо: - На расстоянии > 2000 попугаев, отображать указатель на вражеский объект. - На расстоянии > 1000 попугаев, вражеский объект должен двигаться и поворачиваться к игроку. - На расстоянии > 600 попугаев, двигаться, поворачиваться и стрелять. - На расстоянии > 300 только вращаться и стрелять.
2. Необходимо узнать, о том, что один объект повернут к другому объекту. Есть объект А двигающийся по х,у. Есть объект Б, который постоянно поворачивается на 1 градус в сторону позиции объекта А. Необходимо определить условие, что объект Б повернулся к объекту А.
На том же примере ТДС: Есть ивент "rotate toward position", с позицией игрока. Т.е. вражеский объект всегда стремиться повернуться на игрока. Как отловить момент, когда вражеский объект перестал нацеливаться, чтобы совершить выстрел?
Как бы такие условия реализовать?
|
|
| |
vladhad22 | Дата: Суббота, 18 Июля 2015, 18:07 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Rikushi, Я в construct не очень разбираюсь, но в школе на алгебре учили формулу вычисления расстояния между двумя точками. Счас растолкую: припустим, есть точки А(х1; y1) и B(x2; y2). Чтобы вычислить их расстояние используется формула: √(х2 - x1)+(y2 - y1). Это, если две оси. Чтобы было понятнее, прицеплю картинку: AB-расстояние, х1(2)-положение по оси абсцисс, у1(2)-положение по оси ординат, z1(2)-положение по оси апликат Для двух осей Для трёх осей AB- записать в переменную. Потом просто проверять, тип if(AB>2000) iObjectShow; if(AB>1000)iObjectMove и тд.....
А вот с поворотом не знаю как...
Цитата Rikushi ( ) топ даун шутор
:lol:
Prepare for unforeseen consequences
Сообщение отредактировал vladhad22 - Суббота, 18 Июля 2015, 18:11 |
|
| |
Nick_Rimer | Дата: Вторник, 21 Июля 2015, 07:51 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Rikushi, в принципе, поведение LineOfSight (LOS) как раз тем и занимается, что имитирует "зрение" объекта в заданном угловом диапазоне и на заданной дистанции, к тому же можно использовать препятствия для блокировки обзора. И почему его использовать нет возможности? Можно нацепить несколько LOS'ов правда, не могу точно сказать, как это отражается на загруженности машины.. Подобной механикой ещё обладает Turret. Он вообще создан для нахождения объекта и стрельбы по нему, можешь комбинировать. Кстати, можно применить такой трюк.. если объектов В много, а объект А - один, можно попробовать не объектам В искать А, а схитрить и объекту А дать команду искать В, а интерпретировать это наоборот (разработчики часто пользуются всяческими хитростями для упрощения механики).
Посмотри мой небольшой исходник: СКАЧАТЬ Я использовал здесь поведение турели, но фиксировал окончание поворота средствами встроенных функций System. Комменты в исходнике.
Версия: C2 r210 Срок хранения: 90 дней
- Доброе утро, Агент Пи!
|
|
| |
Jhon | Дата: Вторник, 21 Июля 2015, 08:07 | Сообщение # 4 |
частый гость
Сейчас нет на сайте
| К вопросу про "повернут на объект": Скалярное произведение Если равно нулю, то векторы взгляда ортогональны, если больше нуля, то повернут в сторону объекта, если меньше - от него.
Сообщение отредактировал Jhon - Вторник, 21 Июля 2015, 08:07 |
|
| |