Другой способ поиска ближайшего объекта
| |
Krosos | Дата: Вторник, 23 Июля 2013, 00:11 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Долго я думал , почему ИИ так тупит , и пришел к следующему выводу: (Это последняя проблема связанная с передвижением ИИ) Объект ищет ближайшую точку АА , которые создают объекты союзников для только , чтобы враги-воины шли на эти точки и атаковали врага. Точка находится за препятствием и она самая дальняя , а враг считает наоборот , что она сама ближняя , когда самая ближняя точка это та, которая ниже , но моему ИИ пофиг и он начинает движение типа 1 когда нужно движение типа 4. Тип 1 - движение через точку М(Движение мимо всех к объекту за стеной), объект всегда будет стремиться к тому объекту , который стоит за стеной , а не к тому , который в его зоне досягаемости , но чуть дальше. Тип 4 - движение к точке АА с последующей атакой.
Вся суть заключается в поиске ближайшей точки АА. Я использовал instance_nearest(x,y,AA) Есть ли другой способ? Или другой вариант(Наиболее трудный)
if mp_grid_path(global.Moving_mpgrid,AA_Path2,x,y,global.Sunit.x,global.Sunit.y,false)=false {instance_destroy()}
if global.DeleteAA=1 and mp_grid_path(global.Moving_mpgrid,AA_Path3,x,y,global.Sunit.x,global.Sunit.y,false)=true and path_get_number(AA_Path3)>global.RangePath2 {instance_destroy()}
Эти 2 скрипта удаляют: 1)Недосягаемую точку 2)Точку которая недосягаема для некоего ранга (Все левые и ненужные точки) , но если объект за стеной , то он ни фига не удаляет. Я не знаю , пока как реализовать этот способ: Проверять дальность пути if mp_grid_path(global.Moving_mpgrid,AA_Path3,x,y,global.Sunit.x,global.Sunit.y,false)=true and path_get_number(AA_Path3)=Число Х, которое постоянно увеличивается {И когда такой путь становится возможным , счет останавливается и удаляет точки которые не досягаемы для некоего числа Х}
Мой проект
Сообщение отредактировал Krosos - Вторник, 23 Июля 2013, 00:12 |
|
| |
yarickyarick | Дата: Вторник, 23 Июля 2013, 00:19 | Сообщение # 2 |
Маленький лицемер
Сейчас нет на сайте
| Krosos, я конечно саму тему не читал(СЛИШКАМ МНАГА БУКАФ), да и гейммейкера не знаю, но почему бы не сделать так: distanceX = o.x - h.x; distanceY = o.y - h.y; distance = sqrt(distanceX * distanceX + distanceY * distanceY);
maxDistance = 1000; distance = max(1 - (distance / maxDistance), 0);
После сравнивать distance относительно каждого объекта? Тк distance приватная переменная каждого объекта.
Если прям углубляться, то можно каждому объекту задать радиус и если в этом радиусе есть определенный объект, то к нему и собственно объекту в радиус которого он вошел применять данные действия.
, да и не морочить себе мозг поиском новых способов?
Сообщение отредактировал yarickyarick - Вторник, 23 Июля 2013, 00:19 |
|
| |
Krosos | Дата: Вторник, 23 Июля 2013, 00:26 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| yarickyarick, суть заключается в том , что нужно удалить объекты АА которые находятся очень далеко по достижению , но очень близко по дистанции. Как показано на скрине , все точки АА должны удалиться кроме той ближней, что находится под врагом.
Добавлено (23.07.2013, 00:26) --------------------------------------------- АА ,указанный зеленой полоской - это самая ближняя точка по мнению ИИ , а она наоборот самая дальняя.
Мой проект
Сообщение отредактировал Krosos - Вторник, 23 Июля 2013, 00:29 |
|
| |
USeR14 | Дата: Вторник, 23 Июля 2013, 12:05 | Сообщение # 4 |
RUSOriginal Studio
Сейчас нет на сайте
| Попробуй еще прописать проверку на "прямое столкновение": if !collision_line(x, y, АА.x, АА.y, block, false, true) //Если линия НЕ касается объекта block
|
|
| |
Krosos | Дата: Среда, 24 Июля 2013, 02:06 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| USeR14, я так уже сделал , появляется новая проблема(Ох , когда они уже там закончатся) Если все объекты за стеной , то враг просто стоит и постоянно пропускает ход , пока союзники не возьмут и не выйдут наружу. И так можно гонять бедного врага от препятствия к препятствию.Добавлено (24.07.2013, 02:06) --------------------------------------------- Проблема решена!
if global.Phase3=1 and instance_exists(AA){ while global.StopAA=0 {global.ATR+=1 with AA { if mp_grid_path(global.Moving_mpgrid,AA_Path3,x,y,global.Sunit.x,global.Sunit.y,false)=true and path_get_number(AA_Path3)=global.ATR {global.StopAA=1 break}} }} if global.StopAA=1 { with AA{ if mp_grid_path(global.Moving_mpgrid,AA_Path,x,y,global.Sunit.x,global.Sunit.y,false)=true and path_get_number(AA_Path)>global.ATR+1 {instance_destroy()}}
И вуаля
Мой проект
|
|
| |
|