Шаг за шагом делаем
простой AI противника.
Делаем 2 спрайта.
Спрайт
противника делаем из 8 (можно другое
количаство) картинок повёрнутых против часовой стрелки на 360 градусов.
Делаем 2 обьекта Игрок (Igrok), Противник (Protivnik).
Идём в
обьект противника, для начала делаем так чтобы картинка менялась в
зависимости от направления движения обьекта. В событии шага (step)
кладём скрипт, там прописываем:
image_single=direction*image_number/360
Дальше
нам надо что бы обьект двигался, в событии создания (create) кладём
красную кнопу (start mooving in directions), выбираем все направления,
ставим скорость 3. Дальше нам надо чтобы направление через
какой-то промежуток времени менялось. Для этого в событии создания
обьекта кладём Часы - Alarm0, интервал 70. В событии Alarm0 кладём
нашу кладём красную кнопу (start mooving in directions), выбираем все
направления, ставим скорость 3. Добавляем ещё часы Часы - Alarm0,
интервал 70. У нас получился бесконечный цикл - через 70 чагов
противник будет выбирать случайное направление. Если 8 стандартных
направлений мало, тогда нашу красную кнопу заменяем на скрипт в котором
прописываем что-то типа:
direction=random(360)
Делаем комнату, ставим противника, запускаем, смотрим.
Дальше,
нам
наверняка не нравиться что противник иногда исчезает в неизвестных
далях за краем холста, предлагаю сделать так чтобы он появлялся из за
противоположного края холста. Ставим событие Intersect bounary, в нём
ставим скрипт в котором прописываем:
if
(x<0) {x=room_width} if (x>room_width) {x=0}
if
(y<0) {y=room_height} if (y>room_height) {y=0}
Надеюсь
с кодом всё понятно.
Сделаем так, чтобы при попадании снаряда
игрока, противник начинал охотиться за игроком. Делаем спрайт
снаряда (или пули), создаеём обьект снаряда. В
событии создания противника добавляем скрипт, в котором задаём значение
переменной, благодаря которой будет определяться поведение противника:
global.battle=false
если значение false
значит мир, если true, значит война.
Делаем спрайт пули, создаем
обьект Pyla.
Теперь настало время немного заняться игроком. Движение
будет осуществляться с помощью стрелок, выстрел с помощью левой кнопы
мыши. В
обьекте игрока ставим 4 события нажатия стрелок клавы, в каждой ставим
красную кнопу задания движения, с соответствующим направлением и
скоростью. Для прикола задаём обьекту трение, кидаем в событие создания
иконку трения (set the friction) со значением 0.1. Выстрел, он
будет производиться при нажатии левой кнопки в произвольном месте
экрана, пуля будет лететь в направлении от обьекта игрока к месту где
была нажата мышь. Один из способов "поймать" клик в произвольном
месте экрана состоит в создании невидимого обьекта который постоянно
следует за мышью. Итак делаем спрайт, ничего на нём не рисуем, убираем
у него галку прозрачности (transparent), ставим значения origin 16/16.
Создаём невидимый обьект (Nevid) с этим спрайтом, отключаем галку
Visible, кидаем скрипт в событие шага (step), там прописываем:
x=mouse_x y=mouse_y
Теперь делаем
собственно создание пули. Ставим в событие Left Pressed нашего
невидимки скрипт, там прописываем:
igr_pula=instance_create(Igrok.x,Igrok.y,Pyla)
igr_pula.speed=5 igr_pula.direction=point_direction(Igrok.x,Igrok.y,mouse_x,mouse_y)
Не забываем расположить этот обьект в комнате. Запускаем,
смотрим.
В
обьекте Pyla в событии Collision event с противником, ставим сначала
событие уничтожения обьекта, затем скрипт, в котором пишем:
global.battle=true //(это обьявление войны)
Ставим
также событие Outside Room, в нём также уничтожаем обьект.
Теперь
собственно сделаем поведение нашего AI противника в состоянии войны. Он
должен преследовать игрока и производить выстрел по ходу движения. Через
определённый промежуток времени (допустим 1-2 секунды) противник будет
менять своё направление в сторону игрока. Прежде
всего сделаем для него пулю (PylaAI), по примеру пули игрока делаем
уничтожение пули при столкновении с игроком и при выходе за пределы
комнаты.
Теперь идём в обькт противника, в событии создания
добавляем таймер Alarm1 через 40 шагов. В событии этого таймера
(Alarm1) ставим скрипт в котором прописываем:
if(global.battle==true) { direction=round
(point_direction (x,y,Igrok.x,Igrok.y) /45) *45 pr_pula=instance_create
(x,y,PylaAI) pr_pula.speed=5 pr_pula.direction=direction }
Тут
всё просто за исключением строки: direction=round(point_direction
(x,y,Igrok.x,Igrok.y) /45) *45 В ней мы определяем направление
движения, основа строки point_direction
(x,y,Igrok.x,Igrok.y), которая определяет точное направление от
привника к игроку, но сложность в том, что у нас противник движеться
только в 8 направлениях, если мы определили точное направление 190
градусов, двигаться надо в направлении 180 градусов. Формула такая -
(ближайшее целое число от (направление/(360/количество направлений))) *
360/количество направлений. или ближайшее целое число от
(направление/(360/8))) * 45. или round
(point_direction (x,y,Igrok.x,Igrok.y) /45) *45
Собственно
всё, основа есть.
|