В этом уроке мы сделаем маленький шутер с использованием ИИ
Создаем проект и объекты:
ObjPlayer для игры
ObjBot будет использоваться как враг
ObjBlock будет препятствием
ObjBullet1 пуля для игрока
ObjBullet2 пуля для бота
Сделайте им спрайты
Теперь создаем комнату
В настройках комнаты

В видах комнаты:

Переходим к игроку
В create

Spd=4 //скорость ходьбы
TimeAttack=0 //таймер, нужен для стрельбы
SpdAtack=4 //скорость стрельбы
Hp=100 //жизни игрока
global.DistSound=300 //на какой дистанции будет слышен звук
global.Sound=false //воспроизведения звук
global.SoundX=0 //где был воспроизведен звук
global.SoundY=0 //где был воспроизведен звук
Alarm[0]

global.Sound=0 //мы обнулим переменную
Step

view_xview[0]=(x-(view_wview/2)) //камера будет следовать за игроком по x
view_yview[0]=(y-(view_hview/2)) //камера будет следовать за игроком по y
image_angle=point_direction(x,y,mouse_x,mouse_y) //игрок будет поворачиваться за мышкой
if Hp<=0 {instance_destroy()} //если у игрока "жизни" упадут до 0 то игрок уничтожится
if mouse_check_button(mb_left) {
TimeAttack+=1
if TimeAttack>SpdAtack {
global.Sound=1 //был воспроизведен звук
global.SoundX=x //записываем в переменную для того что бы бот смог понять где был звук
global.SoundY=y //тоже
alarm[0]=15
var bulet;
bulet=instance_create(x+lengthdir_x(15,image_angle),y+lengthdir_y(15,image_angle),ObjBullet1) //создаем пулю
with (bulet) {
motion_set(point_direction(x,y,mouse_x,mouse_y),35)
image_angle=direction
}
TimeAttack=0 //обнуляем переменную
}
}
//теперь переходим к ходьбе
if keyboard_check(ord("W")) {
if not place_meeting(x,y-(Spd+5),ObjBlock) {
y-=Spd
}
}else{
if keyboard_check(ord("S")) {
if not place_meeting(x,y+(Spd+5),ObjBlock) {
y+=Spd
}
}
}
if keyboard_check(ord("A")) {
if not place_meeting(x-(Spd+5),y,ObjBlock) {
x-=Spd
}
}else{
if keyboard_check(ord("D")) {
if not place_meeting(x+(Spd+5),y,ObjBlock) {
x+=Spd
}
}
}
Переходим к боту
У него в Create

Move = mp_grid_create(0,0,room_width/32,room_height/32,32,32); //создаем сетку
mp_grid_add_instances(Move,ObjBlock,0); //создаем путь
Path = path_add(); //добавляем в переменную путь
path_speed=3 //скорость ходьбы
ViewDist=600 //дальность обзора
Hp=100 //жизни
StepCol=0 //идти тогда когда не виден игрок
TimeBullet=0 //таймер
SpdAtack=7 //скорость атаки
Alarm[0]

StepCol=1
Step

if instance_number(ObjPlayer)=1 { //если игрок жив
if Hp<=0 { //если жизни меньше и ровны нулю
instance_destroy() //уничтожаемся
}else{
if Hp>20 and Hp<50 { //если жизни больше 20 и меньше 50
path_speed=2 //уменьшаем скорость с 3 на 2
}
}
if !collision_line(x,y,ObjPlayer.x,ObjPlayer.y,ObjBlock,0,1) { //проверяем "виден ли игрок"
if distance_to_object(ObjPlayer)<ViewDist { //если он близко
image_angle=ScrAngle(ObjPlayer.x,ObjPlayer.y) //поворачиваемся к нему
alarm[0]=45
TimeBullet+=1 //прибавляем к переменной значений 1 "это у нас секундомер"
if TimeBullet>SpdAtack { //если у секундомера значение равна SpdAtack
var bulet;
bulet=instance_create(x+lengthdir_x(15,image_angle),y+lengthdir_y(15,image_angle),ObjBullet2) //создаем пулю
with (bulet) {
motion_set(point_direction(x,y,ObjPlayer.x,ObjPlayer.y),35)
image_angle=direction
}
TimeBullet=0 //обнуляем таймер
}
if distance_to_object(ObjPlayer)>(ViewDist-200) { //если игрок в поле зрения но далеко
mp_grid_path(Move,Path,x,y,ObjPlayer.x,ObjPlayer.y,1) //создаем путь
path_start(Path,path_speed, 0, 0); //идем по пути
}else{
path_end() //мы дошли до нормальной дистанции "останавливаемся"
}
}
}else{
if global.Sound=1 { //если звук был воспроизведен
if point_distance(x,y,global.SoundX,global.SoundY)<global.DistSound { //если можем услышать звук
if path_get_length(Path)<800 { //если этот звук по пути доносился близко
mp_grid_path(Move,Path,x,y,global.SoundX,global.SoundY,1) //создаем путь
path_start(Path,path_speed, 0, 0); //идем по пути
}
}
}
if StepCol=1 {//если переменная StepCol ровна 1
mp_grid_path(Move,Path,x,y,ObjPlayer.x,ObjPlayer.y,1) //создаем путь
path_start(Path,path_speed, 0, 0); //идем по пути
StepCol=0
}else{
image_angle=direction //изменять переменную на direction (direction равен тому куда идет ИИ)
}
}
}
В объекте ObjBullet1 ставим события
Столкновения

с ObjBlock и в нем действие уничтожения
Вне комнаты

и в нем действие уничтожения
Столкновения

с ObjBot в событие код:
other.Hp-=20 //урон
instance_destroy()
В объекте ObjBullet2 ставим события
Столкновения

с ObjBlock и в нем действие уничтожения
Вне комнаты

и в нем действие уничтожения
Столкновения

с ObjPlayer в событие код:
ObjPlayer.Hp-=10 //10 это урон
instance_destroy()
НЕ ЗАБЫВАЕМ СОЗДАТЬ СКРИПТ ScrAngle
var I;
I=point_direction(x,y,argument0,argument1)
return I;
Этот урок сделан на гм8 (не lite)
Маленький примерчик для гм8.1
скачать