Этот номер посвящен разработке
платформенной игры (Platformer). Эта статья написана как для новичков,
так и для тех, кто провел с Game Maker'ом не один год. Ну не будем тянуть кота за хвост
и приступим.
Создаем Героя
Для начала нужно выбрать хороший спрайт. Добавляем спрайты и называем
их s_hero_left и
s_hero_right соответственно. Если все получилось, то идем
дальше.
Теперь создаем объект под названием
o_hero. Устанавливаем ему такие
параметры:
Устанавливаемобъекту спрайт s_hero_right;
--- Create ---
// Отключаем анимацию
при создании (это чтоб он у нас не дергался как паралитик)
image_speed = 0;
--- Step ---
// Гравитация (если под ним нет земли, то включаем
гравитацию
в противном случае отключить ее) if place_free (x,y+1) {gravity = 0.5;
gravity_direction = 270;}
else {gravity = 0;
gravity_direction = 270;}
// Если скорость больше 12, то приравниваем
к 12 (чтоб сильно не разгонялся) if (vspeed > 12)
vspeed = 12;
--- Keyboard Event for <Left> Key ---
image_speed = 0.3; // Включаем анимацию
sprite_index = s_hero_left;
// Устанавливаем спрайт движения влево
move_contact_solid
(180,3); // Сдвигаемся на 3 пикселя в направлении 180 градусов
--- Keyboard
Event for
<Right> Key ---
image_speed = 0.3; // Включаем анимацию
sprite_index
= s_hero_right; // Устанавливаем спрайт движения влево
move_contact_solid
(0,3); // Сдвигаемся на 3 пикселя в направлении 0 градусов
--- Key Press
Event for
<Up> Key ---
// Если под ногами земля, то прыгаем
if (place_meeting (x,y+1,o_wall))
vspeed = -8;
Делаем дополнения
Вот собственно и все. С героем разобрались. У нас в коде использован
объект o_wall. Уверен, многие догадались, что это за объект. Грубо говоря,
это наша земля. А точнее твердый объект (Solid) размером 16x16. Не забудьте
назвать его o_wall.
Проверка
Теперь создаем комнату и делаем из объектов o_wallнечто похожее на уровень. Проверяем. Вроде что-то не то. Не
бойтесь, это не баги. Просто некоторые не доработки. Далее их мы и будем
исправлять.
Улучшаем
Если
вы уже не много проверили героя на прыгучесть, то возможно заметили, что
в прыжке он дрыгает ногами. Чтоб нам избавится от этого не естественного
движения, нужно добавить код image_speed =
0; в действие --- Step --- нашего героя:
Если вам не хочется,
чтобы анимация шла, когда герой стоит, то могу предложить простенький
код герою в действие, когда все клавиши отпущены:
--- Key Release
Event for <any key> Key ---
image_speed = 0; //
Отключаем анимацию, когда все кнопки отпущены
Пояснение
В коде присутствует функция
move_contact_solid
(dir, maxdist). Новички, наверное, спросят, зачем эта функция, если можно
обойтись x- = 3 и x + =3. Но нет мои дороги читатели, в платформере с
x- = 3 и x+ = 3 вы не оберетесь багов! Объект, не смотря на то, что он
solid, постоянно зацепляется за края стен и глючит. Можете проверить. Возможно, и есть решение
этой проблемы, но я его не нашел. И еще. Лучше функции
move_contact_solid
(dir, maxdist) для платформера я тоже не нашел.
Вот привел вырезку из справки
о возможностях функции
move_contact_solid
(dir, maxdist):
move_contact_solid
(dir, maxdist) - Заставляет образец объекта двигаться в направлении
dir до
тех пор, пока текущий образец объекта не столкнётся с образцом твёрдого
объекта. Аргумент maxdist содержит максимальную дистанцию (в пикселях),
которую следует пройти образцу объекта. То есть, если образец объекта проходит
максимальную дистанцию не встречая образцов твёрдых объектов, то он всё
равно остановится. Если вы хотите, чтобы образец объекта всё же двигался
до столкновения, независимо от размера пройденного пути, присвойте maxdist
значение -1 (для произвольного расстояния используйте отрицательные значения).
Конец
Теперь проверьте. Работает? Вот и отлично!
Интересный файл
И на последок ссылка на недавно появившуюся у нас lib библиотеку:
С ее помощью вы сможете без проблем создавать 3D объекты, камеры, освещение. Одним словом: создание 3D игр упроститься во много раз. А если вам лень качать 4 мегабайта, то есть упрощенная версия этой библиотеки: