[Из песочницы] Создаем платформер за четыре вечера

8bb3501c0c57d97e9223878b4f4749bc.png Сразу оговорюсь: речь пойдет о гейм-девелопменте для души. Чтобы не стыдно было показать игру миру — придется попотеть подольше.

Как и многие, я стал программистом из-за детской мечты написать собственную игру. Со временем я посвятил себя другой области, но однажды решил во что бы то ни стало воплотить мечту в жизнь. Здесь я хочу поделиться своим опытом, чтобы, возможно, вдохновить вас.

1. Цель Моей целью было создание классического платформера, но с такими сюжетом, персонажами и уровнями, которые интересны мне. Я хотел сделать игру своими силами и специально для себя; при этом сделать ее с минимальными затратами сил и своего свободного времени.2. Поиск инструментов Конечно, создавать геймплей с нуля неразумно. Я начал с поиска конструкторов и сред разработки игр и нашел достаточно большой список на сайте [http://gcup.ru/load/konstruktory_igr/12]. Отдельного внимания хочу удостоить конструкторы, позволяющие быстро создать тематические игры: например, Open Zelda [http://openzelda.net/] или Mario Worker [http://www.softendo.com/game/Mario%20Worker]. Настоящий клад для фанатов.1bade1d8450308448282791c5fd01ed0.png Не редкость и конструкторы, которые позволяют создавать игры классических жанров (в том числе и платформеры), и при этом вообще не требуют навыков программирования. Например, 001 Game Creator [http://www.engine001.com/] или Rune Sword [http://www.runesword.com/].7f02cb7af06125737dc1c845eefd8701.png При всей своей функциональности, подобные конструкторы в некоторой мере ограничивают творца в возможностях. Кроме того, большинство фич этих инструментов, таких как портирование игр на Андроид, платные.Среди прочих средств проектирования игр, мое внимание привлек Tululoo Game maker [http://tululoo.com/].0c4df5208ed6ccc311a02d3e208cb4dc.jpg   9b2f59fea5f6c7d5f5d681fbc76e99f7.jpg Преимущества налицо: полностью бесплатный инструмент, объединяющий в себе удобство готового движка с вариативностью программирования специфических аспектов игры. К тому же, готовая игра представляет собой веб-страницу на HTML5 с javascript, что позволяет выложить игру в интернет. Самым большим неудобством можно считать отсутствие отладчика. И все же, это вариант отлично решает мою задачу, поэтому на нем я и остановился.3. Быстрый старт в Tululoo Game maker Для работы со средой Tululoo Game maker необходимы какие-никакие знания ООП, javascript, а также наличие браузера с поддержкой HTML5. В среде существует 2 проекта-примера: адвенчура и платформер. Я взял за основу предложенный платформер, что значительно упростило старт написания своей игры. В примере уже существуют один уровень и персонаж, который умеет перемещаться, прыгать, собирать монетки и стрелять по ящикам, — великолепный шаблон для дальнейших экспериментов.5694caf62348098a65b06e17bd00a0b6.png Для тех, кто заинтересовался созданием игры с помощью Tululoo Game Maker, я рассмотрю несколько этапов работы для более быстрого и приятного старта.4. Редактирование персонажа В редакторе игры переходим на вкладку Objects → Двойной клик по объекту obj_player → в списке обработчиков событий объекта выберем Step. В поле Code preview подгрузится соответствующий событию javascript.634625d6b674d8cacf982c836e7cfbe3.png

Следует отметить, что в коде объекта obj_player сосредоточена основная механика игры — через взаимодействие игрока с остальными объектами игрового мира. Событие Step выполняется по таймеру каждый кадр; количество кадров в секунду настраивается при редактировании уровней (я принял значение по умолчанию — 60 кадров в секунду). Сейчас в событии Step обрабатывается нажатие клавиш и столкновение игрока с объектами ландшафта. Первым делом заменим изображение игрока на нашего героя. Нового персонажа я нарисовал в пэинте в двух вариантах: смотрящим влево и вправо, и добавил получившиеся рисунки в спрайты на вкладке Sprites. После загрузки каждой картинки по кнопке Edit можно перейти к редактированию изображения, где есть полезная опция Erase color, — с помощью нее можно стереть фон, добившись тем самым правильного контура.

07ec26b85445b5391818fb3c980e1915.png Теперь необходимо вернуться к редактированию объекта obj_player и указать для него один из новых спрайтов.622d01541ad93e3e27f6c7de0f0b3b0c.png Поработаем с кодом: научим объект игрока поворачиваться влево и вправо. Для этого будем менять картинку персонажа между левосторонней и правосторонней, используя свойство sprite_index (более полное описание API можно увидеть в хелпе).obj_player событие Step:

В самом начале кода редактируем строки:

if (x > room_width) { x = room_width; instance_destroy (); room_goto_next (); } if (keyboard_check (vk_right)) { x += 4; if (direction > 0) sprite_index = spr_player_right; //change sprite if direction changed direction = 0; if (place_meeting (x, y, obj_ground) != null || place_meeting (x, y, obj_box) != null) { x = xprevious; } }

if (keyboard_check (vk_left)) { x -= 4; if (direction == 0) sprite_index = spr_player_left; //change sprite if direction changed direction = 180; if (place_meeting (x, y, obj_ground) != null || place_meeting (x, y, obj_box) != null) { x = xprevious; }

} Запускаем и радуемся. Анимацию шагов делать сложнее, поэтому не буду рассматривать здесь эту процедуру.

5. Добавление объектов Добавим два объекта: противника и снаряд, которым он будет стрелять. При создании объекта противника унаследуем его от obj_box, чтобы он препятствовал прохождению сквозь себя игрока, а также уничтожался при попадании снаряда. В обработчики событий Creation и Step добавим код для стрельбы по игроку.ecbaa100128b97e5a259135bbc0a3d56.png   c46aab2335f81ae0bd40aee8efc04fdc.png Код игрока придется подредактировать: при контакте со снарядом противника obj_player будет уничтожаться. Также вынесем объект игрока в глобальную переменную.90747519034982481c5889d533e58a17.png Код объектов: Global variables:

global.player = obj_player; obj_player событие Creation:

this.air = 0; this.jump = 0; global.player = id; obj_player событие Collision with obj_enemy_bullet:

instance_destroy (); obj_enemy_1 событие Creation:

this.timer_max = 60; this.timer = this.timer_max; this.distance_fire = 480; this.bullet_speed = 5; this.bullet_height = 25; obj_enemy_1 событие Step:

//aim player distance = global.player.x — x; direction = 0;

if (distance < 0) { distance = -distance; direction = 180; }

function fire () { // DECREASE THE TIMER timer--; if (timer <= 0 ) { bullet = instance_create(x,y - bullet_height, obj_enemy_bullet); bullet.direction = direction; bullet.speed = bullet_speed; timer = timer_max; } }

if (distance < distance_fire) { fire(); } 6. Редактирование уровней Последний шаг, важный для создания полноценного платформера — создание уровней. В Tululoo для этого весьма простой интуитивно понятный интерфейс: в конструкторе на вкладке Scenes набрасываем нужные объекты в игровую зону — и готово. Конечно, дизайн уровней — важный и самый трудоемкий процесс. Здесь настоящий простор для воображения.b23b86a150cb4d37aff7f5a5e022271b.png Отдельно опишу часть кода, отвечающую за переключение между уровнями. Для это используется функция room_goto_next (более полное описание API можно увидеть в хелпе).obj_player событие Step:

Заменим последнюю строку кода на:

if (x > room_width) { x = room_width; instance_destroy (); room_goto_next (); } Результирующий код этого события будет выглядеть так:

obj_player событие Step:

if (keyboard_check (vk_right)) { x += 4; if (direction > 0) sprite_index = spr_player_right; //changew sprite if direction changed direction = 0; if (place_meeting (x, y, obj_ground) != null || place_meeting (x, y, obj_box) != null) { x = xprevious; } }

if (keyboard_check (vk_left)) { x -= 4; if (direction == 0) sprite_index = spr_player_left; //changew sprite if direction changed direction = 180; if (place_meeting (x, y, obj_ground) != null || place_meeting (x, y, obj_box) != null) { x = xprevious; }

}

if (keyboard_check_pressed (vk_up) && jump == 0) { jump = 1; air = 12; //sound_play (snd_jump); }

if (air > -5) air -= 0.5;

y -= air;

if (place_meeting (x, y, obj_ground) != null || place_meeting (x, y, obj_box) != null) { y = yprevious; air = 0; jump = 0; }

if (keyboard_check_pressed (vk_space)) { bullet = instance_create (x, y — 25, obj_bullet); bullet.direction = direction; bullet.speed = 15; }

if (x < 0 ) x = 0; if ( x > room_width) { x = room_width; instance_destroy (); room_goto_next (); } 7. Резюме Существует множество способов простого создания игры своей мечты. Я разобрал лишь один из них; возможно, кто-то сможет найти более удобные инструменты, — прошу оставлять ваши отзывы о них в комментариях. Желаю Вам творческих успехов! 019674b8bca942fe9f1f7640fe485b6b.png

c3f0047c1e0244aeadba918f4e8565fc.png

© Habrahabr.ru