Намекну: чтобы в чем-нибудь разобраться, нкжно иметь терпение и быть внимательнее. Я не зря поросил отправить проэкт мне в личку - дело в том, что "Зомби прут на меня и крутятся вокруг своей оси" - далеко не лучшее описание проблемы. Хотя, быть может, я тебя понял ^_^ Не знаю, погубил ли кого-нибудь альтруизм, но я попробую описать простейшее поведение зомби, если я правильно понимаю, что они из себя представляют. Прочти внимательно и попробуй разобраться :) В версиях GMLа ниже 6.x для изображения персонажа использовалось два спрайта, например s_zombR и s_zombL. В одном из них персонаж был повернут вправо, в другом - влево. В версиях GML 6.x (поскольку там используется DirectX) это можно реализовать имея лишь один спрайт (например, s_zomb ) и используя image_xscale. image_xscale=-1 инвертирует изображение по горизонтали. Я остановлюсь на этом варианте. Итак, ms=4 - скорость зомби, задается в create эвенте. sam - персонаж игрока. зомби следит за персонажем (step event):
if (sam.x>x) {
x+=ms
image_xscale=1
}
else {
x-=ms
image_xscale=-1
}
для, того чтобы зомби не проходил сквозь стены, усовершенствуем:
if (sam.x>x)&&(place_free(x+ms,y)) {
x+=ms
image_xscale=1
}
else if (place_free(x-ms,y)) {
x-=ms
image_xscale=-1
}
Если стены не солидные, то вместо place_free(x+ms,y) используй !place_meeting(x+ms,y,wallp) // wallp - parent стен Далее, затем чтобы зомби остановился вблизи игрока (я так понимаю, что это и есть твоя проблема) усовершенствуем еще:
if (abs(sam.x-x)<6) exit //выйти из скрипта
//вместо 6 может стоять другое значение - оно зависит от того, как далеко от игрока должен остановиться зомби
if (sam.x>x)&&(place_free(x+ms,y)) {
x+=ms
image_xscale=1
}
else if (place_free(x-ms,y)) {
x-=ms
image_xscale=-1
}
Ну вот, в общем-то, и все. Более компактно: (но на это не обращай внимание ;) )
if (abs(sam.x-x)<6) exit
dx = sign(sam.x-x)
x += ms*dx*place_free(x+ms*dx,y)
image_xscale = dx