Привет, игроделы! Материал этого урока даст вам оооочень широкие возможности. Прочитав сегодняшний урок вы сможете сделать уже довольно развитую игрушку. Поэтому этим уроком мы с вами прервёмся на лето. Следующий урок будет только 28 августа. Читайте и запоминайте!
Думаю вы уже знаете что такое объекты. Они совмещают в себе все ресурсы, кроме комнат. В частности они являются хранителями событий и действий, а также носителями спрайтов. Насчёт событий и действий подробнее.
События мы очень подробно будем рассматривать аж в 4 сезоне
Каждый шаг ГМ проверяет возможность выполнения события. Если возможность появляется, то ГМ отдаёт сигнал на выполнение соответствующих действий. Поскольку вы обучаетесь в Школе ГМЛ, то действие у нас одно: Execute piece of code.
Событий в ГМ очень много -
353. Поэтому советую вам перед следующим прочтением полазить в событиях и узнать что к чему. Особенно советую уделить внимание вкладке Other.
А теперь...
... я вас познакомлю с несколькими функциями
instance_create(x, y, obj) - создаёт в точке (x, y) объект obj и возвращает его id
instance_destroy() - удаляет
экземпляр объекта в котором прописан код
game_end() - завершает игру
game_restart() - перезапускает игру.
С этими функциями я могу вас завалить практическими заданиями, но нет лучшего практического задания, чем создавание игр. Поэтому я просто покажу несколько устоявшихся выражений в ГМЛ.
Создайте игру по описанию: у игрока спрашивают два числа, и программа создаёт объект с спрайтом в точке (число1; число2)
1)
Создание объекта относительно краёв окна. Используются константы room_width, room_height. Например
instance_create(room_width-5, room_height/2, obj)
2)
Создание объекта относительно положения мыши. Используются константы mouse_x, mouse_y. Например
instance_create(mouse_x+7, mouse_y-4, obj)
3)
Создание n объектов через одинаковое расстояние t начиная с m по горизонталиfor(i=0; i<n; i+=1)
{
instance_create(m+i*t, y, obj)
}
3.1) --
по вертикалиfor(i=0; i<n; i+=1)
{
instance_create(x, m+i*t, obj)
}
PS : если надо в обратном порядке, то минус заменяем на плюс
4)
Создание объекта в случайном месте.instance_create(random(room_width), random(room_height), obj)
5)
Создание случайного объектаinstance_create(xx, yy, choose(obj1, obj2, obj3 ... obj16))
ИЛИ (на более 16 объектов)
object[0]=obj0
object[1]=obj1
object[n]=objn
...
instance_create(xx, yy, object[irandom(n)])
6)
obj1 сталкивается с obj2, при этом obj1 должен исчезнутьwith(self)
{
instance_destroy()
}
ИЛИ
with(other)
{
instance_destroy()
}
7)
Уничтожение объекта, если тот ниже нижней границы окна (например если игрок упал в пропасть в платформере)
if(y>room_height)
{
instance_destroy()
}
8)
Завершить или перезапустить игру, если кончились жизни (или здоровье)if(<переменная, отвечающая за здоровье или жизни><=0)
{
game_end()//или game_restart()
}
Хочу отметить одно свойство:
допустим у нас есть такой код
a=0
a+=6
a*=get_integer('', 0)
game_restart()
a-=7
a/=2
a*=3
game_restart() не прерывает игру. Сначала выполнится весь код, а только потом уже игра перезапустится. Аналогично с game_end(). Поэтому после этих функций предпочтительно ставить exit;
Теперь давайте рассмотрим пример простейшей игры. ТДС. Заготовим спрайты игрока, врага, пули игрока и пули врага. Создадим им соответствующие объекты o_gamer, o_enemy, o_gamer_bullet, o_enemy_bullet. Давайте составим концепцию игры:
Игрок всё время следит за мышью. При нажатии левой кнопкой мыши, создаётся пуля, которая летит туда, куда смотрел игрок. Враг - ИИ. То есть ходит сам по себе, но если игрок близко, то идёт к нему и начинает стрелять. У обоих есть жизни.
Вот в принципе и всё. Давайте воплощать. Начнём с игрока.
Игрок всё время следит за мышью.
Всё время - событие Step, следит за мышью - изменяем поворот картинки.
direction=point_direction(x, y, mouse_x, mouse_y)
image_angle=direction
Теперь сделаем движение по кнопке вверх.
speed=5
И чтобы сделать реалистику добавим
friction=0.8
Ах да, чуть не забыли главную вещь
move_wrap(1, 1, 0)
Отлично. Ставим игрока в комнату и запускаем. Теперь нужно сделать ему стрельбу.
Пишем
instance_create(x, y, o_gamer_bullet)
А движение пропишем у пули.
direction=point_direction(x, y, mouse_x, mouse_y)//направление к мыши
speed=6
И ещё:
instance_destroy()//уничтожаем, когда улетела
Отлично теперь займёмся врагом. У него движение основано на рандоме. НО! Есть оговорка, что если игрок подойдёт слишком близко, то идёт по направлению к игроку. Для этого создадим переменную, отвечающую за расстояние до игрока.
dist=point_distance(x, y, o_gamer.x, o_gamer.y)
А в шаге будем вычислять это значение
dist=point_distance(x, y, o_gamer.x, o_gamer.y)
if(dist<=100)//а если игрок близко
{
move_towards_point(o_gamer.x, o_gamer.y, 4)//движемся к нему
}
Теперь создадим перемещение
alarm[0]=room_speed*random_range(2, 3)
direction=random(360)
if(dist>100)//если игрок далеко
{
alarm[0]=room_speed*random_range(2, 3)
direction=random(360)
}
А теперь осталось соорудить стрельбу.
alarm[1]=random(4*room_speed)
if(dist<=100)
{
alarm[1]=room_speed/2
}
else
{
alarm[1]=random(4*room_speed)
}
instance_create(x, y, o_enemy_bullet)
И у o_enemy_bullet в Create пропишите
direction=point_direction(x, y, o_gamer.x, o_gamer.y)//направление к игроку
speed=6
иии
instance_destroy()
Так. Основа готова. Теперь осталось пара мелких штрихов. А именно пропадание пуль и жизни. Тут всё просто
hp=100
with(other){instance_destroy()}
hp-=20//убьёт с 5 раз
if(hp<=0)
{
show_message('Вы проиграли!')
game_restart()
}
Аналогично проделайте у o_enemy.
Ну чтож, на этом я с вами прощаюсь на лето. Всем пока и удачного игростроя!
На самом деле ещё не всё. Задания будут маленько позднее