Создание Сложный / Элементарный ИИ Для 2D Платформенных Игр

Автор: merser433

Создание Сложный / Элементарный "Искусственный Интеллект" Для 2D Платформенных Игр 
В этой статье я хочу показать как можно создать интеллект для ваших мобов (врагов / нейтральных / дружелюбных) в 2D
Если вас интересует что то в ИИ но здесь этого нет то напишите мне в ЛС (личным сообщением) или сюда и я обязательно вам помогу  
Статья будет пополнятся  

Элементарные ИИ
Кролик
Для начала создадим объект кролика и назовем его o_npc_bunny
Спрайт возьмем из террарии ^_^ (Прикрепленно)
В событие создания вставим этот код:
Код:
//Изображение
image_speed=0 //Скорость изображения равна 0 то есть у NPC будет анимация сидения/стояния (не знаю как объяснить точнее ;D) когда он создастся
//Гравитация и движение
speed_max = 2; //Максимальная скорость NPC (для быстрой и легкой настройки)
jump_speed = 8; //Высота прыжка для нашего кролика *_*
gravity_amount = 1; //Сила гравитации
gravity_direction = 270; //Направление гравитации
//Искусственный Интеллект (основа прыжков и движения)
alarm[0]=choose(30,60,90,120,150,180,210,240,270,300) //Запускаем случайный таймер на прыжок (меняйте под себя) sm_milo
alarm[1]=choose(120,150,180,210,270,300) //Запускаем случайный таймер на передвижение (меняйте под себя)
gotoleft=false //Ход влево (если оно будет стоять на true то NPC будет идти влево (позже) то есть при создание кролик будет стоять на месте
gotoright=false //Ход вправо (если оно будет стоять на true то NPC будет идти вправо (позже) то есть при создание кролик будет стоять на месте

Сейчас мы выполнили действия для основного управления NPC
а теперь мы выполним функции движения
В событие Хода / Step добавим следующее:
Код:
if gotoleft=true //Если функция хода влево равна true
{
  if place_free(x - speed_max, y) //И если территория свободна (дальше я не очень могу объяснить :D)
  x -= speed_max; //тогда x уменьшается (передвигается ВЛЕВО) на параметр скорости
  else
  move_contact_solid(180, speed_max); 
}

if gotoright=true //Если функция хода вправо равна true
{
  if place_free(x + speed_max, y) //то тоже самое что выше :D
  x += speed_max;
  else
  move_contact_solid(0, speed_max);
}

if place_free(x, y + 1) //Если позиция ниже свободна
{
  gravity = gravity_amount; //То гравитация включена и равна параметру гравитации (мы это настроили в создании) 
}
else //Иначе
{
  gravity = 0; //Гравитация отключена 
}

Теперь наш NPC может бегать но ему же нужны таймеры что бы это делать которые мы указали в событие создания
Создадим событие Будильник 0 / Alarm 0 который будет отвечать за прыжок
и добавим в действие кода / Execute Code следующее:
Код:
alarm[0]=choose(30,60,90,120,150,180,210,240,270,300) //Создадим новый таймер на прыжок для бесконечности

if gotoright=true //Если кролик бежит вправо (можете это убрать но кролик будет тупо и без анимации прыгать на месте)
{
 vspeed = - jump_speed; //То вертикальная скорость равна параметру прыжка
}
if gotoleft=true //Если кролик бежит влево (можете это убрать но кролик будет тупо и без анимации прыгать на месте)
{
 vspeed = - jump_speed; //То вертикальная скорость равна параметру прыжка
}
Теперь кролик БУДЕТ прыгать если бы не факт что он прыгает только во время движения
Добавим в событие Будильника 1 / Alarm 1 он у нас будет отвечать за бег
и вставим туда следующее:
Код:
gorightleft=choose(0,1) //Делаем случайный выбор направления бега от 0 до 1 т.е 1 ход влево 0 ход вправо
if gorightleft=0 //Если параметр "gorightleft" (выбор направления) равен 0
{
 image_xscale=-1 //то поворачиваем картинку вправо
 gotoright=true //параметр шага вправо равен true
 alarm[2]=choose(120,150,180,210) //задаем будильник 2 / alarm 2 на случайное число (далее он будет отвечать за остановку хода вправо)
 image_speed=0.5 //скорость картинки равна 0.5
}
if gorightleft=1 //Если параметр "gorightleft" (выбор направления) равен 1
{
  image_xscale=+1 //то поворачиваем картинку влево
  gotoleft=true //параметр шага влево равен true
  alarm[3]=choose(120,150,180,210) //задаем будильник 3 / alarm 3 на случайное число (далее он будет отвечать за остановку хода влево)
  image_speed=0.5 //скорость картинки равна 0.5
}
Теперь наш NPC может ходить и прыгать но не останавливается =О
добавим в событие будильника 2 / Alarm 2 (почему я пишу после кода одно и тоже) этот код: 
Код:
gotoright=false //ход вправо отключаем
image_index=0 //картинка равна начальной
image_speed=0 //Скорость изображения равна 0 то есть анимация остановки
alarm[1]=choose(120,150,180,210,270,300) //задаем новый таймер на выбор направления хода
добавим почти такой же код в событие будильника 3 / Alarm 3 он будет отвечать за остановку хода влево почти так же как и прошлый
Код:
gotoleft=false //ход влево отключаем
image_index=0 //картинка равна начальной
image_speed=0 //Скорость изображения равна 0 то есть анимация остановки
alarm[1]=choose(120,150,180,210,270,300) //задаем новый таймер на выбор направления хода
тадам наш кролик готов лишь осталось добавить блок земли 
создадим обьект o_block спрайт сделаем любой главное что бы он был квадратный (или его маска)
и ОБЯЗАТЕЛЬНО сделаем его твердым
добавлять в его события ничего не нужно

теперь у нас есть блок добавим кролику в событие соприкосновения с блоком следующий код:
Код:
x = xprevious; //x возвращаем обратно на прошлую позицию
y = yprevious; //с y делаем тоже самое что с x

if vspeed < 0 // если вертикальная скорость равна нулю
  move_contact_solid(90, -vspeed); //то дальше я не разбираюсь :D (скопипастил со старенького примера)
else //иначе
  move_contact_solid(270, vspeed); //я все равно не в этом не разбираюсь :D 

vspeed = 0; // вертикальная скорость равна нулю
Фюх ну вот и готово если вам что то не понятно с кроликом то я выложил пример (прикреплено)

Слизень
В этой главе я хочу показать как сделать слизня (как в террарии)  
Создадим объект o_npc_slime и дадим ему спрайт (прикреплено) почему он серый? узнаете чуточку позже
Добавим в событие создания следующий код (пояснения в коде)
Код:
//Изображение
image_speed=0 //Скорость изображения равна 0 это у нас будет анимация остановки ^_^
image_blend=choose(c_red,c_black,c_blue,c_green,c_purple) //Выбираем цвет для слизня (вот почему у нас серая картинка)
//Гравитация и движения
jump_speed = 12; //Высота прыжка для слизня так сказать Основа для передвижения *_*
gravity_amount = 1; //Сила гравитации 
gravity_direction = 270; //Направление гравитации
//Искуственный интелект "ИИ"
alarm[0]=choose(50,55,60,65,70,75,80,85,90,95,100) //Запускаем случайный таймер на прыжок (меняйте под себя)
После надо добавить событие Будильника 0 /Alarm 0
но он не будет отвечать за сам прыжок а лишь за анимацию колебания и запуск самого прыжка (конечно можете изменить) 
добавим в это событие следующий код:
Код:
image_speed=0.5 //Скорость изображения 0.5 (Анимация колебания)
alarm[1]=20 //Запускаем таймер на будильник 1 отвечающий за прыжок и остановку анимации
 
Теперь слизень должен будет колебаться перед прыжком но не прыгать и работать!  
В событие Alarm 1 добавим вот этот код:
Код:
image_speed=0 //Скорость анимации равна 0 т.е останавливаем анимацию колебания
image_index=0 //Номер изображения равен 0 (что бы слизень случайно не остался сжатым)

jrl=choose(0,1) //JRL Так я наименовал выбор стороны прыжка 0=Влево, 1=Вправо "Jump Right Left" 
vspeed-=jump_speed //Вертикальная скорость равна параметру прыжка 

{
if jrl=0 and not place_free(x,y +1) //Если JRL равен 0 (влево) и позиция снизу занята
hspeed-=2 //Горизонтальная скорость равна -2 пикселя в шаг (по стандарту комнаты 30 шагов в секунду)
if jrl=1 and not place_free(x,y +1) //Если JRL равен 1 (вправо) и позиция снизу занята
hspeed+=2 //Горизонтальная скорость равна +2 пикселя в шаг
}

alarm[0]=choose(50,55,60,65,70,75,80,85,90,95,100) //Ставим новый таймер на анимацию колебания и прыжка
Теперь лишь осталось прояснить компьютеру что за параметр gravity_amount и поставить тем самым гравитацию
для этого надо добавить в событие Шага/Step Вот эти несколько строк:
Код:
if place_free(x, y + 1) //Если позиция ниже свободна
{
  gravity = gravity_amount; //То гравитация включена и равна параметру gravity_amount
}
else //Иначе
{
  gravity = 0; //Отключаем гравитацию
}
Наш слизень готов но он же будет падать и падать
добавим объект o_block (не надо если вы делаете в примере кролика) ^_^
Спрайт Сделаем ему ЛЮБОЙ желательно квадратный
писать в его события мы ничего не будем разве что сделайте его ОБЯЗАТЕЛЬНО твердым
ну а после добавим слизню в событие столкновения с блоком следующие строки:
Код:
x = xprevious; //X Возвращаем на прошлую позицию
y = yprevious; //С Y делаем также 

if vspeed < 0 // Если вертикальная скорость равна нулю
  move_contact_solid(90, -vspeed); //То совершаем движение под 90 градусов (я не очень разбираюсь с действием move_contact_solid)
else //Иначе
  move_contact_solid(270, vspeed); //Совершаем движение по 270 градусов

vspeed = 0; //Вертикальная скорость равна 0
hspeed = 0; //Горизонтальная скорость равна 0
Слизень готов!  
если вам не понятно пример слизня прикреплен

http://forum.hellroom.ru/index.php?action=dlattach;topic=7714.0;attach=8406

http://forum.hellroom.ru/index.php?action=dlattach;topic=7714.0;attach=8407

http://forum.hellroom.ru/index.php?action=dlattach;topic=7714.0;attach=8454

http://forum.hellroom.ru/index.php?action=dlattach;topic=7714.0;attach=8455

Категория: Уроки по Game Maker | Добавил: Dogvill (12.03.2012)
Просмотров: 894 | Комментарии: 2 | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email:
Код *: