Суббота, 23 Ноября 2024, 15:53

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Несколько вопросов про планирование путей и поведение АИ
DaedrosДата: Суббота, 30 Января 2016, 10:48 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет. Возникла проблема. Делаю платформер, суть в двух словах - есть враги, которые при старте комнаты идут к сундукам, адекватно перепрыгивая препятствия. Подходят к сундучку, "грабят" его, идут к следующему, если они еще остались. Главный герой должен защитить сундуки на уровне, соответственно, если его убьют либо полностью ограбят - поражение. Помимо этого, враги при дистанции, пусть будет условно, 400, бегут за ГГ, а при дистанции, опять же, условно, 200 - начинают кидать в него заклинания. А теперь что, собственно, меня беспокоит - объект сундук (chest) у меня один. Поэтому все ИИ начинают бежать к одному и тому же экземпляру объекта, потом бегут к следующему и т.д. в том порядке, в котором я их добавил в в комнату. Подскажите, как заставить их бежать к ближайшему экземпляру объекта? Применять костыль из нескольких сундуков плохо, потому что придется еще делать несколько одинаковых ИИ, только с разным порядком обхода сундуков.
Дальше, прибежав к одному сундуку, все ИИ кучкуются, и в итоге после нескольких обходов сундуков совсем сливаются. Все мои попытки их отталкивать друг от друга, привели к тому, что они просто тупят. Не думаю что это как-то сложно исправить, особенно, если заставить их бегать отдельно, но хотелось бы и от этой фигни избавиться. Ну и на засыпку - адекватные пути. ИИ должны прыгать на блоки, спрыгивать с них при необходимости, чтобы добраться до сундуков. Перерыл кучу примеров, выбрал на мой взгляд самый адекватный - http://rghost.ru/6fxcN7yJv (называется platform_exampl.gmk) В этом примере ИИ "агрится" на ГГ и преследует его, перепрыгивая препятствия, чтобы сделать выстрел. Пытался разобраться и переделать под конкретно свой случай - мои ИИ сразу поворачивают направо и бегут до упора, потом успешно застревают wacko
И последнее, пытался чтобы вместо одних лишь фаерболов, враги могли кидать и другие заклинания. Но они просто прекратили вообще что-то делать и перешли врукопашную. ЧЯДНТ?

Без проблем могу скинуть куски кода проекта, либо сам целиком. Надеюсь, форум еще жив и мне помогут) Последний раз делал что-то на гейммейкере года 4 назад)

Step для enemy
DIDAДата: Суббота, 30 Января 2016, 11:09 | Сообщение # 2
частый гость
Сейчас нет на сайте
Берешь в степ добавляешь переменную.
Код
chest = instance_nearest(x,y, ob_chest);
И потом просто в
Код
move_towards_point(chest.x, chest.y,5);
Только измени название объекта на obj_chest или ob_chest, чтобы было понятно объект это или спрайт или еще чего...


Сообщение отредактировал DIDA - Суббота, 30 Января 2016, 11:10
DaedrosДата: Суббота, 30 Января 2016, 11:17 | Сообщение # 3
был не раз
Сейчас нет на сайте
DIDA,
Спасибо огромное, сменил название, не знал про instance_nearest()
Теперь самое главное разобраться с правильным поведением для ИИ, чтобы прыгали на "пол", спрыгивали. И, поскольку у меня используется if (distance_to_object(hero_o) < 400){move_towards_point(hero_o.x,hero_o.y,5);} ИИ напрочь забывает про гравитацию, просто летит в игрока


Сообщение отредактировал Daedros - Суббота, 30 Января 2016, 11:37
Quad69Дата: Суббота, 30 Января 2016, 12:47 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
instance_nearest(x,y,obj) просто возвращает id ближайшего объекта obj к координатам x y.

Код
//obj_enemy - Step
var in,xx,yy;
in = instance_nearest(x,y,obj_chest)
xx=in.x
yy=in.y
//Имея id нужного объекта можно получить его координаты, спрайт и т.д...
if x>xx {if place_free(x-4,y) {x-=4}}//и т.д...
DaedrosДата: Суббота, 30 Января 2016, 20:22 | Сообщение # 5
был не раз
Сейчас нет на сайте
maksim1221232, спасибо, хоть и в целом, это было очевидно уже исходя из функции, и того, что она возвращает.

Все еще нужна помощь с рандомом (пусть ИИ стреляет рандомными заклинаниями, исходя из трех возможных). И, видимо, нужны хорошие примеры поведения ИИ для платформера, когда он умеет прыгать по препятствиям двигаясь к цели
maksim1221232, спасибо, хоть и в целом, это было очевидно уже исходя из функции, и того, что она возвращает.

Все еще нужна помощь с рандомом (пусть ИИ стреляет рандомными заклинаниями, исходя из трех возможных). И, видимо, нужны хорошие примеры поведения ИИ для платформера, когда он умеет прыгать по препятствиям двигаясь к цели
UPD при помощи дебага, проблема с рандомом была решена

Разыскиваются примеры движения ИИ:)


Сообщение отредактировал Daedros - Суббота, 30 Января 2016, 21:01
Quad69Дата: Суббота, 30 Января 2016, 21:24 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Код
if !place_free(x-1,y)//Если слева что то твёрдое
{
//Прыжок
}
if place_free(x-4,y+1)//Если слева пропасть
{
//Прыжок
}
DaedrosДата: Вторник, 02 Февраля 2016, 18:15 | Сообщение # 7
был не раз
Сейчас нет на сайте
Рассчитываю пути через сетку, враги исправно бегут к цели, поднимаясь и спускаясь по лестницам. При приближении персонажа, их цель перемещается на него, и путь рассчитывается уже за персонажем. Казалось бы все хорошо, но при спуске-подъеме на лестницу, в момент перехода с неё на твердые блоки, персонажи застревают. 1) Изначально все поняли свой путь, успешно идут по нему, залезают на блоки.
2) Пытаются построить свой путь до объекта игрока - тупят

3) вот такая картина в итоге - стоят и не могут слезть/залезть

Черным нарисован путь, красным - цель
BrightSpotДата: Вторник, 02 Февраля 2016, 18:42 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
очевидно же, что мобы "срезают" углы и из-за своей маски застряют... поколдуй с сеткой, что бы не было срезов.


Более мощный компьютер глючит быстрее и точнее.
DaedrosДата: Вторник, 02 Февраля 2016, 19:15 | Сообщение # 9
был не раз
Сейчас нет на сайте
BrightSpot, при изначальном движении к сундуку никаких срезов не образуется. Не могу понять причину их возникновения при движении за персонажем

Добавлено (02 февраля 2016, 19:15)
---------------------------------------------
Ну тоже очевидно, что срезы образуются из-за косячного расчета пути в момент, когда моб находится на вершине лестницы, но еще не слез с неё, вот и пытается ближайшим образом попасть на твердую поверхность, а уже с неё нормально рассчитывает. Но я уже ума не приложу, как это можно исправить, может у кого-нибудь есть идеи? либо это как-то костыльно решать, убирал твердость у стены при контакте с врагом, он же все равно движется по маршруту и не падает. но уже добравшись до цели шлепается, плюс ГГ проваливается


Сообщение отредактировал Daedros - Вторник, 02 Февраля 2016, 19:23
Quad69Дата: Вторник, 02 Февраля 2016, 23:03 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
По скринам я понял что ты каждый шаг используешь поиск пути.
В функции mp_grid_path есть аргумент allowdiag, попробуй поставить на 0.
И вообще, проблема должна пропасть если ты будешь использовать только один раз эту функцию.

Вот код из моей старой игры.
Код
if !path_index or (xx!=path_get_point_x(path_index, path_get_number(path_index)-1) and yy!=path_get_point_y(path_index, path_get_number(path_index)-1))
{
var path=path_add();
if !mp_grid_path(cells,path,x,y,xx,yy,true) {xx=x;yy=y;path_end();exit;}
path_start(path,1,0,true)
}
//xx и yy это точка куда нужно двигаться.
DaedrosДата: Среда, 03 Февраля 2016, 12:58 | Сообщение # 11
был не раз
Сейчас нет на сайте
maksim1221232, главный герой перемещается, и поэтому путь приходится рассчитывать путь каждый шаг.
allowdiag стоит в 0.
Событие Room Start - сетка
Код
mp_grid_clear_all(grid1);

for (i = 0; i < ceil(room_width / cage_w); i += 1)
     for (j = 0; j < ceil(room_height / cage_h); j += 1)
        {
         if !((!collision_point(i * cage_w, j * cage_h, wall, false, true) && collision_point(i * cage_w, (j + 1) * cage_h, wall, false, true)) || collision_point(i * cage_w, j * cage_h, o_ladder, false, true) || (!collision_point(i * cage_w, j * cage_h, wall, false, true) && collision_point(i * cage_w, (j + 1) * cage_h, o_ladder, false, true)))
         mp_grid_add_cell(grid1,i,j);
        }


Степ - движение по пути

Код

switch stage
    {
    case 1:
        {
            if instance_exists(o_goal)
                if mp_grid_path(grid1, path1, x, y, o_goal.x div cage_w * cage_w + cage_w / 2, o_goal.y div cage_h * cage_h+ cage_h / 2, false)
                    {
                     stage = 2;                   
                     if moving == 0 {
                        path_start(path1, 5, 0, 1);
                        }                        
                    }    
         break;
        }       
        
    }
    
  • Страница 1 из 1
  • 1
Поиск:

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