Супер урок для начинающих по Game Maker (v8 платформенная игра)

Автор: Хазгалиев Денис
Начало разработки: 22 Марта 2011 год.
Конец разработки: 24 Марта 2011 год.
Язык туториала: русский

Супер потому, что сразу переходим на создание реальный игры(не то, что бессмысленный шарик, отскакивающий от стены), не
будем мелочится, тем более все понятно объяснено.
Каждый дилетант хочет создать свой супер экшен, и я вам помогу создать его основу.
Ссылка для примера (в архиве присутcтвует пример и этот же урок с расширением doc) Super_lessons_GM.rar

Итак, приступим:
Для начала создадим спрайты (Sprites).
Спрайты – это как бы внешний вид персонажи, стенок… (с анимации или без).
Создадим спрайт главного игрока

• Называем его P_L, то есть, анимация движений налево (имя не имеет значение, вы можете назвать любое другое имя).
• Нажмите на кнопку «Загрузить Спрайт».
• В окне выберите свои спрайты, я выбрал 3 спрайта (32х64), которым в дальнейшем будет анимироваться как движение налево
• Нажмите «открыть» и нажмите ОК

Далее нам нужно убрать фон:
• На вкладке Sprites два раза нажмите на спрайт (P_L)
• Нажмите на кнопку «Редактировать»
• На верхнем панеле изображений выберите «стереть цвет» и нажмите ОК

То же самое делайте и со спрайтом, который движется направо (для удобства можно сделать отражение в редакторе на верхней панели трансформации).
В общем, должны быть следующие спрайты (Sprites).
• P_L – спрайт игрока, двигающийся налево(32х64)
• P_R – спрайт игрока, двигающийся направо(32х64)
• stop – спрайт игрока стоящего (32х64)
• V_R – спрайт врага, двигающийся направо(32х64)
• V_L – спрайт врага, двигающийся налево(32х64)
• ammo – спрайт пистолета(32х32)
• mas – спрайт маска для игрока и врага он должен совпадать с их размерами(в моем случае черный прямоугольник 32х64)
• jump – спрайт прыжка (действует только для врага) (черный квадрат 32х32)
• boll1 – спрайт пуля игрока(черный квадрат 12х12)
• boll2 – спрайт пуля врага(красный квадрат 12х12)
• box – спрайт твердый блок это и пол, потолок, стена…(32х32)
• lives – спрайт жизни игрока, который будет висеть на левом верхнем углу(32х32)

Всё со спрайтами, то есть с внешними видами разобрались.
Теперь начинаем создавать объекты(Objects), которые и будут действовать в игре.
Создадим объект игрока

• Называем его player (имя не имеет значение, вы можете назвать любое другое имя).
• Выбираем любой спрайт игрока (я выбрал спрайт stop).
• Для маски выбираем спрайт mas
• Нажимаем ОК
Маска нужна, чтобы игрок не застревал на твердые блоки (компьютер будет думать, что игрок черный прямоугольник).

Тоже самое делаете и для врага – имя vrag, маска та же(они одинаковы с игроком), любой спрайт врага.
Маски нужно ставить только для игрока и для врага, а на других не надо.
Для объекта блока выбираем спрайт box, соответственно называем объект box и в его настройках ставим галочку на твердый.

Для объекта прыжка (для врага) выбираем спрайт jump, соответственно называем объект jump и в его настройках убираем галочку с видимый.

Далее создайте остальные объекты с выбранными спрайтами в соответствии с их именами.
Итак, подведем итог:
• Объект player – выбран спрайт stop, выбран спрайт маски mas
• Объект vrag – выбран спрайт V_R, выбран спрайт маски mas
• Объект ammo – выбран спрайт ammo
• Объект control – для него спрайт не надо ставить, он будет рисовать жизнь игрока и здоровье врага.
• Объект jump – выбран спрайт jump, вставлен галочка на твердый.
• Объект boll1 – выбран спрайт boll1
• Объект boll2 – выбран спрайт boll2
• Объект box – выбран спрайт box, снят галочка из видимый

Спрайты готовы, объекты готовы, отлично!!!
Теперь начнем самый важный раздел «события и действия».
Начнем с игрока.

• Откройте объект игрока (player) на вкладке Objects
• Нажмите на кнопку «Добавить событие», потом на кнопку «Создание»
Создается событие Create, то есть, что будет создаваться в начале, а создаваться будет 3-жизни и 0-пуль, давайте это сделаем.

• На вкладке score перетаскиваем соответствующую иконку, как показано на рисунке в поле действии.
• На поле ставим ноль
• На «относительно» галочку не ставим (по умолчанию он пустой).
• Так же делаем и с сердечком и ставим три

Далее создадим событие шаг

• Создается событие Step
• Во вкладке control перетаскиваем иконку, кода в поле действии
• В поле кодов пишем следующие коды, этот код осуществляет гравитацию для игрока (сила тяжести).

Code

{
   // устанавливаем силу тяжести (гравитация)
   gravity_direction = 270;
   if place_free(x,y+1)
     gravity = 0.9
   else
     gravity = 0;
   // ограничиваем скорость
   if (vspeed > 12) vspeed = 12;
}

Далее создадим событие столкновения.

• Выбираем объект пистолета (ammo), создается событие ammo.
• Перетаскиваем в действии уже известную иконку, пишем 20 и вставим галочку на относительно, то есть при столкновении с объектом ammo должен стать у игрока 20 пуль, но есть одна проблемка, при столкновении 20 пуль он даст, а исчезать не будет, для решения этой проблемы нужно:
1 на вкладке main1 находим иконку корзины и перетаскиваем в поле действии
2 переключаем на «другие», если мы бы переключили на «себе», то исчез бы игрок, а так исчезает другой объект, а именно объект ammo.
Далее создадим событие столкновения.

• Выбираем объект пуля врага (boll2)
• Создаем действия как показано на рисунке, то есть при столкновении:
1 отнимается одна жизнь
2 пуля исчезает
3 игрок перемежается в начальное место
Далее создадим событие столкновения.

Ставим код для блока, то есть для объекта box (это вы уже знаете, как сделать, повторяться не буду!) и пишем следующий код.
Code

{
   if (vspeed > 0 && not place_free(x,y+vspeed)) move_contact(270);
   vspeed = 0;
}

Далее создадим событие не нажатой клавиши.

• Нажмите на кнопку «Добавить событие» потом на «клавиатура».
• Выберите No key, то есть клавиша не нажато
Что будет делать игрок, когда не одна клавиша не нажато?
Он ничего не будет делать, только нарисуется стоящий спрайт - это спрайт stop, для этого:

• На вкладке main1 перемежаем иконку колобка ? в поле действии.
• Выбираем спрайт stop
Далее создадим событие левой клавиши.

Клавиатура потом «влево» и появится событие Left
В событие перетаскиваем следующие действии:

• В настройки колобка ставим спрайт движущиеся влево (P_L).
• На subimage пишем all (помнете ли вы когда мы создали спрайт с тремя кадрами), почему all(все)?, потому, что мы выбираем все 3 спрайта и получатся анимированный спрайт, если мы бы поставили например 2, то рисовалось бы только 2-ой кадр спрайта.

• На speed пишем 0.5 – это скорость анимации(вы можете написать другое значение в зависимости от скорости движение объекта, которые сейчас будем определять).
• Перетаскиваем иконку кода и пишем в поле код движение объекта налево, значение 4 означает скорость движение объекта.
Code

  {
   if place_free(x-4,y) x -= 4;
}

Далее создадим событие верхней клавиши.

В действии перетаскиваем иконку кода и в поле пишем код прыжка (-11 – чем меньше это значение, тем высоко прыгнет ваш игрок).
Code

{
   if (not place_free(x,y+1)) vspeed = -11;
}

Далее создадим событие правой клавиши.
Тоже самок как и с левой клавиши (только спрайт поставьте P_R), но код будет отличатся этим:
Code

{
   if place_free(x+4,y) x += 4;
}

Далее создадим событие «нет больше жизни».

• Нажмите на кнопку «Добавить событие» потом на «Другие».
• Выберите «нет больше жизни» и создается событие No More Lives.
Для него создаем действие, которые игра начнется заново, если не будет больше жизни.

На вкладке main2 перетащите иконку Restart
Далее создадим событие «нет больше здоровья».

В событии No More Health (нет больше здоровья) будем делать действие, которые при истечение здоровий, враг исчезнет.
Для этого:
• Перетащите корзинку из вкладки main1.
• Переключите на «Объект» и выберите объект врага (vrag)
Далее создадим событие «Клавиша нажата».

• Нажимаем на кнопку «Добавить событие» потом на «Клавиша нажата», если мы выбрали бы «Клавиатура», то игрок стрелял бы как из пулемета и 20 пуль закончились бы в один миг.
• Выбираем Space (клавиша пробел) и создается событие press <Space>
В действии перетаскиваем следующие иконки:

Перетаскиваем проверку пули и настраиваем, как показано на рисунке.
Далее перетаскиваем иконку блок начало (Start block) и иконку проверки переменной (Test Variable) на вкладке control.

• В настройках Test Variable на variable пишем sprite_index
• На operation выбираем equal to
• На value пишем название спрайта движущегося налево, почему?, потому, что если рисоваться этот спрайт, то будет какая - то реакция, эту реакцию мы будем создавать в виде пули, исходящий из игрока и движущегося в левую строну.
Для этого:

• Перетащите иконку Create moving в поле действии
• В настройках Create moving на object выбираем пулю игрока (boll1)
• На X и Y рассчитываем источник пули как показано на рисунке ниже
• На speed пишем 12 (скорость пули)
• На direction пишем значение по направлению, в нашем случае налево, значение 180
• Обязательно ставьте галочку на относительно

Далее создайте копии этих двух иконок Test Variable и . Create moving

измените их настроек так:
• Для Test Variable измените P_L на P_R
• Для Create moving измените значение 180 на 0
Далее нам нужно чтобы при нажатии пробел(Space)количество пуль уменьшилась на 1
Для этого:

• Перетащите иконку Set Score в поле действии
• В настройках напишите значение -1 и ставьте относительно
• Перетащите конечный блок во вкладке control
Всё с объектом игрока(player) закончили!!!
Теперь начнем с объекта врага (vrag).

• Откройте объект врага (vrag) на вкладке Objects
• Нажмите на кнопку «Добавить событие» потом на кнопку «Создание» (Создается событие Create, то есть, что будет создаваться в начале).
• В событии перетаскиваем переменные в поле действии со значениями(эти переменные нужны для событие шага):
Первое переменное variable – firing, value – 0
Второе переменное variable – target, value – noone
Третье переменное variable – range, value – 300
Четвертое переменное variable – rate, value – 1
Пятое переменное variable – damage, value – 50

Далее перетаскиваем иконку здоровья, пишем значения 100 (в начале у врага будет 100% здоровья).
Во вкладке move найдите иконку с красными стрелками и настройте, как показана на рисунке, то есть в начале враг будет двигаться вправо или влево со скоростью 4.
Далее создадим событие шаг

• Создается событие Step
• Во вкладке control перетаскиваем иконку кода в поле действии
• На поле кодов напишем следующие коды, этот код вынуждает врага стрелять на игрока с определенный дистанции (здесь добавлена и гравитация).
Code

{
  // устанавливаем силу тяжести (гравитация)
   gravity_direction = 270;
   if place_free(x,y+1)
     gravity = 0.5
   else
     gravity = 0;
   // ограничиваем скорость
   if (vspeed > 12) vspeed = 12;     
      
     var ii, dist, xx, yy;
     if firing > 0 firing += 1;
     if firing = 30/rate firing = 0;
     if not instance_exists(target) target = noone;
     if instance_exists(player)
     {
         if target = noone target = instance_nearest(x,y,player);
         if point_distance(x,y,target.x,target.y) > range
             target = noone;
         else if firing = 0
         {
             firing = 1;
             //Create a bullet
             ii = instance_create(x,y,boll2);
             dist = point_distance(x,y,target.x,target.y)/24;
             xx = target.x+target.speed*dist*cos(target.direction*pi/180);
             yy = target.y-target.speed*dist*sin(target.direction*pi/180);
             ii.speed = 6;
             ii.direction = point_direction(x,y,xx,yy);
             ii.damage = damage;
         }
     }
}

:_shocked_: ! Обратите внимание, что в коде присутствует название объекта игрока (player) и пули врага (boll2),если вы не назвали их как я, то переименуйте их на свой.

Далее перетащите иконку проверка переменной и настройте, как показана на рисунке выше (он проверяет горизонтальное движение(hspeed)).

• Далее перетаскиваем иконку колобка и выбираем спрайт врага, движущегося направо (V_R).
• Перетаскиваем иконку Else во вкладке control
• Перетаскиваем еще одного колобка, но уже с V_L
Далее создадим событие столкновение с объектом jump(он невидим).

Перетаскиваем код, в него пишем код прыжка, которые при столкновении враг будет прыгать, вот этот код(этот код мы использовали и для игрока):
Code

{
   if (not place_free(x,y+1)) vspeed = -11;
}

Далее создадим событие столкновение с объектом пули врага(boll1).

• Во вкладке main1 перетащите корзинку, переключите на другой
• Перетащите иконку здоровья, пишите значения -25(при столкновении у врага отнимается здоровья на 25%).
• Поставьте галочку на относительно
Далее создадим событие столкновение с объектом блока(box).

• Во вкладке move перетаскиваем иконку горизонтальное столкновение, то есть враг столкнется со стеной в горизонтальном направлении, то примет обратное направление.
• Перетащите код и пишите следующее:
Code

{
   if (vspeed > 0 && not place_free(x,y+vspeed)) move_contact(270);
   vspeed = 0;
}

Всё с действующими лицами разобрались
Теперь начнем рисовать жизнь игрока и здоровья врага.

• Откройте объект control на вкладке Objects
• Нажмите на кнопку «Добавить событие» потом на кнопку «Рисование» (Создается событие Draw).

• Перетащите иконку рисование здоровья и настройте, как показано на рисунке (здоровье будет висеть чуть пониже, чем жизнь).
• Перетащите иконку рисование жизни в место х и у ставим 0, то есть будет висеть на левом верхнем углу, и выбираем спрайт жизни (lives).
Переходим к объекту пуль игрока (boll1) во вкладке Objects

• Создадите событие «создание» и перетащите переменной с настройками variable – damage, value – 0
• Создайте событие столкновение блока и перетащите корзинку (при столкновении с блоком пуля исчезает)
Переходим к объекту пуль врага (boll2) во вкладке Objects
• Создайте событие столкновение блока и перетащите корзинку (при столкновении с блоком пуля исчезает)
Всё теперь остался последний штрих, создание комнаты игры.
Для этого:

• Во вкладке Rooms (после вкладки Objects) кликнем правой кнопки мышки, и выбираем Create rooms и создается пустая комната
• Для удобства настроем комнату 32 на 32
• Понаставим объекты и нажмем на верхнюю галочку
• Потом в панели инструментов нажимаем на зеленый треугольник (знак запуска игры)
Вот и всё!!!

Ссылка для примера Super_lessons_GM.rar