Итак, давайте займёмся созданием умного АИ для бота в платформенной игре. Наш бот должен лазить по лестницам за игроком, перепрыгивать ямы, перепрыгивать различные препятствия типа ящиков, блоков и т.д. Для начала подготовим спрайты:
S_hero - герой
S_pol - пол
S_bot- бот
S_les-лестница
Далее создадим объект o_hero и в событии шага напишем :
Code
gravity_direction = 270 //Направление гравитации - вниз.
if place_free(x,y+1) //Если снизу нет столкновений...
gravity = 2 //...гравитация равна двум.
else //А если столкновения есть...
gravity = 0 //...гравитация отключается.
if keyboard_check(ord("A")) //если нажата клавиша A...
{
image_xscale = -1 //...отразить героя влево...
if place_free(x-5,y)//...И если нет столкновений...
{
x-=5; image_speed = 0.5 // переместиться влево на 5 пк. со скоростью анимации 0.5.
}
}
//
if keyboard_check(ord("D"))
{
image_xscale = 1
if place_free(x+5,y)
{
x+=5; image_speed = 0.5;
}
}
if keyboard_check(ord("W"))//если нажат пробел...
{
if not place_free(x,y+1)//...и снизу есть опора...
{
vspeed-=20//верт. скорость равна -20 (герой прыгает).
}
}
Столкновение с объектом пола (создайте объект o_pol):
Code
if (vspeed > 0 && not place_free(x,y+vspeed))
{
move_contact(270);
vspeed = 0;
}
И наконец, создайте лестницу, поставьте маску столкновений как узкий прямоугольник и у героя в событии столкновения с лестницей напишите это:
Code
if keyboard_check(ord("W"))//если нажата W
{vspeed=-4//лезем по лестнеце
if distance_to_object(global.ak)<=5
{
x=global.ak.x
}
}
Теперь сделайте пол твёрдым.
Ну вот, наконец, мы можем сделать AI бота. Но для начала немного теории довольно скучной но полезной для понимания (её можете и не читать):
В теории AI можно реализовать так: если до героя меньше 300 px и если герой слева от монстра то проверяем есть ли слева столкновения. Если их нет то движемся в лево, а если есть то прыгаем. Так же делаем если герой справа от монстра.
Вот и весь код. Конечно, его ещё можно доработать и сделать ещё больше функциональным, но это я оставлю вам. И ещё совет – не скупитесь не различные проверки, пусть даже код будет от этого уродливым.
Но напишем это кодом. Для этого создайте скрипт scr_ai с таким кодом:
Code
if distance_to_object(o_hero)<=argument0 and distance_to_object(o_hero)>=2//если дист. до героя меньше аргумента0
{
if o_hero.x<x//если герой левее монстра
{
if place_free(x-1,y)//и слева есть место
{
x-=4//передвигаемся туда.
}
else //иначе
if not place_free(x-1,y)//если там нет места...
{
vspeed=-10 //...то прыгаем.
}
}
else//иначе
if o_hero.x>x//если герой правее монстра...
{
if place_free(x+1,y)//если справа есть место...
{
x+=4//двигаемся туда.
}
else //инача
if not place_free(x+1,y)//если там нет места...
{
vspeed=-10//то прыгаем.
}
}
}
if place_meeting(x,y+2,o_les)
{
if y<o_hero.y//если герой ниже монстра...
{
if global.ak2.x<x
{x+=4}
else
if global.ak2.x>x
{x-=4}
if distance_to_object(global.ak2)<=5
{x=global.ak2.x
vspeed=+4//верт. скорость равна +4
}
}
А теперь создайте объект o_bot и пропишите ему в событие создание такую переменную (значение объясню немного позже):
[code]pr=true//переменная прыжка
И в событие шага поставим гравитацию и активируем наш скрипт AI:
gravity_direction = 270 //Направление гравитации - вниз.
if place_free(x,y+1) //Если снизу нет столкновений...
gravity = 2 //...гравитация равна двум.
else //А если столкновения есть...
gravity = 0 //...гравитация отключается.
scr_ai(300)//выполняем скрипт
if place_meeting(x,y+2,o_les)
{
if y<o_hero.y//если герой ниже монстра...
{
vspeed=+4//верт. скорость равна +4//опускаемся по лестнице
if distance_to_object(global.ak2)<=5
{x=global.ak2.x}
}
}
if x<o_hero.x+4 and x>o_hero.x-4 {x=o_hero.x}//устранение дёрганья
[/code]
Теперь надо сделать что бы монстр не проваливался сквозь пол. Для этого в столкновение с полом напишем:
Code
if (vspeed > 0 && not place_free(x,y+vspeed))
{
move_contact(270);
vspeed = 0;
}
А что бы научить его карабкаться по лестницам в событие столкновения с лестницей напишем:
Code
if y>o_hero.y//если герой выше монстра...
{
vspeed=-4//верт. скорость равна -4
if distance_to_object(global.ak2)<=2
{x=global.ak2.x}
}
Теперь откроем объект лестницы и в создание напишем:
Code
global.ak=0//актив
global.ak2=0//актив2
В столкновение с героем:
А в столкновение с монстром:
Так если герой полезет по лестнице, то бот последует за ним.
Ну и наконец, научим бота перепрыгивать ямы. Для этого в событии начального шага надо написать:
Code
if pr=true//если можно прыгать.
{
if place_empty(x,y+1)//если снизу ничего нет
{
vspeed=-20//прыжок
pr=false//нельзя прыгать
alarm[0]=30//ставим будильник
}
}
Теперь я расскажу, для чего нужна переменная pr. Она нужна для того что бы бот ни летел по воздуху всё время, а только перепрыгивал ямы. И в событии будильника 0 напишем разрешение прыжка:
Code
pr=true//можно прыгать
Теперь расставьте объекты по комнате и протестируйте игру. Скрипт бота вы можете свободно использовать!
Вот исходник: