Четверг, 25 Апреля 2024, 04:54

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Другой способ поиска ближайшего объекта
Другой способ поиска ближайшего объекта
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)
---------------------------------------------
Проблема решена! surprised

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()}}

И вуаля dry





Мой проект
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Другой способ поиска ближайшего объекта
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг