Всем привет. Возникла проблема. Делаю платформер, суть в двух словах - есть враги, которые при старте комнаты идут к сундукам, адекватно перепрыгивая препятствия. Подходят к сундучку, "грабят" его, идут к следующему, если они еще остались. Главный герой должен защитить сундуки на уровне, соответственно, если его убьют либо полностью ограбят - поражение. Помимо этого, враги при дистанции, пусть будет условно, 400, бегут за ГГ, а при дистанции, опять же, условно, 200 - начинают кидать в него заклинания. А теперь что, собственно, меня беспокоит - объект сундук (chest) у меня один. Поэтому все ИИ начинают бежать к одному и тому же экземпляру объекта, потом бегут к следующему и т.д. в том порядке, в котором я их добавил в в комнату. Подскажите, как заставить их бежать к ближайшему экземпляру объекта? Применять костыль из нескольких сундуков плохо, потому что придется еще делать несколько одинаковых ИИ, только с разным порядком обхода сундуков. Дальше, прибежав к одному сундуку, все ИИ кучкуются, и в итоге после нескольких обходов сундуков совсем сливаются. Все мои попытки их отталкивать друг от друга, привели к тому, что они просто тупят. Не думаю что это как-то сложно исправить, особенно, если заставить их бегать отдельно, но хотелось бы и от этой фигни избавиться. Ну и на засыпку - адекватные пути. ИИ должны прыгать на блоки, спрыгивать с них при необходимости, чтобы добраться до сундуков. Перерыл кучу примеров, выбрал на мой взгляд самый адекватный - http://rghost.ru/6fxcN7yJv (называется platform_exampl.gmk) В этом примере ИИ "агрится" на ГГ и преследует его, перепрыгивая препятствия, чтобы сделать выстрел. Пытался разобраться и переделать под конкретно свой случай - мои ИИ сразу поворачивают направо и бегут до упора, потом успешно застревают И последнее, пытался чтобы вместо одних лишь фаерболов, враги могли кидать и другие заклинания. Но они просто прекратили вообще что-то делать и перешли врукопашную. ЧЯДНТ?
Без проблем могу скинуть куски кода проекта, либо сам целиком. Надеюсь, форум еще жив и мне помогут) Последний раз делал что-то на гейммейкере года 4 назад)
Step для enemy
Код
if (place_free(x,y+1)) { gravity_direction = 270; gravity = 1; } if (vspeed > 12) { vspeed = 12; }
if (distance_to_object(hero_o) < 400) { move_towards_point(hero_o.x,hero_o.y,5); if distance_to_object(hero_o) < 200 if can_shoot = true { speed = 0 b = instance_create(x,y,fireball) can_shoot = false alarm[0] = 40 } }
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
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}}//и т.д...
maksim1221232, спасибо, хоть и в целом, это было очевидно уже исходя из функции, и того, что она возвращает.
Все еще нужна помощь с рандомом (пусть ИИ стреляет рандомными заклинаниями, исходя из трех возможных). И, видимо, нужны хорошие примеры поведения ИИ для платформера, когда он умеет прыгать по препятствиям двигаясь к цели maksim1221232, спасибо, хоть и в целом, это было очевидно уже исходя из функции, и того, что она возвращает.
Все еще нужна помощь с рандомом (пусть ИИ стреляет рандомными заклинаниями, исходя из трех возможных). И, видимо, нужны хорошие примеры поведения ИИ для платформера, когда он умеет прыгать по препятствиям двигаясь к цели UPD при помощи дебага, проблема с рандомом была решена
Код
xx = random(1); if xx > 0.5 { b = instance_create(x,y,fireball);} if xx < 0.5 {b = instance_create(x,y,frostarrow);}
Разыскиваются примеры движения ИИ:)
Сообщение отредактировал Daedros - Суббота, 30 Января 2016, 21:01
Рассчитываю пути через сетку, враги исправно бегут к цели, поднимаясь и спускаясь по лестницам. При приближении персонажа, их цель перемещается на него, и путь рассчитывается уже за персонажем. Казалось бы все хорошо, но при спуске-подъеме на лестницу, в момент перехода с неё на твердые блоки, персонажи застревают. 1) Изначально все поняли свой путь, успешно идут по нему, залезают на блоки.
2) Пытаются построить свой путь до объекта игрока - тупят
3) вот такая картина в итоге - стоят и не могут слезть/залезть
очевидно же, что мобы "срезают" углы и из-за своей маски застряют... поколдуй с сеткой, что бы не было срезов. Более мощный компьютер глючит быстрее и точнее.
BrightSpot, при изначальном движении к сундуку никаких срезов не образуется. Не могу понять причину их возникновения при движении за персонажем
Добавлено (02 февраля 2016, 19:15) --------------------------------------------- Ну тоже очевидно, что срезы образуются из-за косячного расчета пути в момент, когда моб находится на вершине лестницы, но еще не слез с неё, вот и пытается ближайшим образом попасть на твердую поверхность, а уже с неё нормально рассчитывает. Но я уже ума не приложу, как это можно исправить, может у кого-нибудь есть идеи? либо это как-то костыльно решать, убирал твердость у стены при контакте с врагом, он же все равно движется по маршруту и не падает. но уже добравшись до цели шлепается, плюс ГГ проваливается
Сообщение отредактировал Daedros - Вторник, 02 Февраля 2016, 19:23
По скринам я понял что ты каждый шаг используешь поиск пути. В функции 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 это точка куда нужно двигаться.