Супер урок для начинающих по Game Maker (v8 платформенная игра)
Автор: Хазгалиев Денис Начало разработки: 22 Марта 2011 год. Конец разработки: 24 Марта 2011 год. Язык туториала: русский
Урок знакомит нас как создать первую 2D платформерную игру. Включает основы добавление спрайтов, действия и события, создание врага, создание жизней. Каждый дилетант хочет создать свой супер экшен, и я вам помогу создать его основу. Ссылка для примера: (в архиве присут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; } } }
Обратите внимание, что в коде присутствует название объекта игрока (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 • Понаставим объекты и нажмем на верхнюю галочку • Потом в панели инструментов нажимаем на зеленый треугольник (знак запуска игры) Вот и всё!!!
Прочел начало. Есть замечания. Быдло-названия. Спрайты лучше было назвать так: P_L, P_R, P_S (а не stop), P_B (а не boll1), E_L, E_R, E_B (а не boll2), E_J (а не jump), mask (а не mas, у меня сразу же ассоциация с mass, к тому же одна буква большой роли не сыграет), ammo, box, lives. Некоторые объекты тоже следует переименовать. Как я понял, направление гравитации не изменяется, поэтому глупо его задавать в step, это надо делать в create.