Суббота, 20.04.2024, 04:21
Главная Регистрация RSS
Приветствую Вас, Гость
Поиск по сайту
Авторизация

Меню сайта
Game Maker
Если вы только-только начали изучать игрострой и еще даже не успели скачать сам Game Maker, предлагаем вам на выбор следующие версии программы:

Game Maker 8.1
Классика. Идеально подходит для создания простых 2D игр на PC. Требует активации.
Game Maker for Mac
Абсолютно та же программа, но только для пользователей Mac. Требует активации.
Game Maker Studio
Самая новая версия с возможностью кроссплатформенной разработки. Бесплатна.
Топ 5 игр
Агент Green 4.2 / 5.0
FeDo 4.2 / 5.0
To Mars: Sec... 4.2 / 5.0
To Mars+MapE... 3.9 / 5.0
Paintball 3.8 / 5.0

Топ игр составлен путем пользовательского голосования.

Если вы не согласны с какой-либо оценкой, примите участие и поставьте свой балл игре. Ваша оценка очень важна для нас ;)
Статистика



На сайте: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Разработка игр

Работаем с геймпадом

Так как игры, разрабатываемые на Game Maker, в большей части своей являются простенькими платформерами и стрелялками, невольно в голове проскальзывает мысль: «а не добавить ли поддержку геймпада своему творению?» И я полностью согласен с этой идеей, поскольку клавиатура на то и клавиатура, чтобы печатать на ней, а джойстик изначально создан для видеоигр. Ну что же, на этом мое вступление заканчивается, давайте творить.

Начнем с того, что Game Maker, как ни странно, ориентирован в первую очередь не на геймпады, а на рули для авто-симуляторов. Из-за этого, как вы понимаете, во многих случаях адаптировать игру под наши любимые рогачи довольно сложно. Но, тем не менее, это возможно, и сегодня на примере TDS я покажу, как это делается.

Ходим, бегаем и все остальное.
Итак, создаем объект игрока, присваиваем ему абсолютно любой спрайт и в событии Begin Step (почему не просто Step, объясню позже) пишем:
 

var xpos,ypos { //Создание временных переменных 

xpos=joystick_xpos(1) //Вычисление позиции джойстика по оси X 
ypos=joystick_ypos(1) //Вычисление позиции джойстика по оси Y 

if place_free(x+(xpos*4),y) x+=xpos*4; //Перемещение игрока по X 
if place_free(x,y+(ypos*4)) y+=ypos*4; //Перемещение игрока по Y 


Как говорилось выше, данный код необходимо прописать именно в Begin Step. Сейчас я попробую растолковать, почему это так нужно. При первой попытке встраивания геймпада я столкнулся с проблемой, когда игрок застревал в объектах стен. Спустя минут десять проб и ошибок, выяснилось, что событие Step, имеющий при себе определенный код, выполняется приблизительно на половину секунды позже события Begin Step. В результате, получается казус, когда программа не успевает просчитать скрипт вовремя и игрок движется на 2-3 пикселя дальше положенного, тем самым впечатываясь в стену. Когда все первостепенные действия выполняются в событии Begin Step, очередь на их выполнение минимальна, и они вступают в силу в первые же миллисекунды.

Продвигаемся дальше. По коду выше вы видите, что переменная xpos вычисляется при помощи функции joystick_xpos(id). Данная функция выводит значение положения стика (той самой круглой фигни, которую можно вертеть в разные стороны) по оси X. Результат данной функции варьируется от -1, когда стик до упора доведен налево, до 1, когда стик соответственно полностью перемещен направо. Также возможны переходные дробные значения (-0.2, -0.1, 0, 0.1, 0.2 и т.д.). Параметр id может иметь значение 1 для работы с первым джойстиком или 2 для работы с джойстиком второго игрока. Так, как Game Maker поддерживает одновременно до 2 геймпадов, id не может быть больше 2 и, чисто логически, меньше 1. Функция joystick_ypos(id) работает аналогично joystick_xpos(id).



Повороты, такие повороты...
Чтобы обеспечить игроку возможность поворачиваться по сторонам, я предлагаю использовать кнопки 5 и 6 (на геймпаде от PS3 они значатся, как L1 и R1). Дабы не было всяких багов и зависаний в стене, введем новую переменную angle, которая будет отвечать за наклон спрайта. Также, заранее проспойлерюсь, нам пригодится создать переменную j_press, о значении которой я расскажу позднее. В событии Create пишем:

angle=0; 
j_press=0; 


Теперь снова переходим к событию Begin Step и прописываем еще один код:

if joystick_check_button(1,5) angle+=10; 
if joystick_check_button(1,6) angle-=10; 


Функция joystick_check_button(id,numb) работает аналогично keyboard_check и возвращает значение true, если кнопка numb нажата, или значение false, если не нажата. Как и в прошлом случае, первый параметр id обозначает порядковый номер подключенного геймпада. Значение numb, как вы уже успели догадаться, обозначает номер нажатой клавиши.

Теперь нам нужно, чтобы игрок изменял угол поворота в зависимости от переменной angle. Для этого в событии Draw пишем:

draw_sprite_ext(sprite_index,image_index,x,y,1,1,angle,noone,1); //Думаю значение этого скрипта разъяснять не надо =) 


Постой-ка, брат мусью!
Дело за малым: научить игрока стрелять. Для этого создадим объект пули с названием o_bullet и в событии Step игрока напишем очередной скрипт:

//ЧАСТЬ 1 
if j_press=0 { 

if joystick_check_button(1,2) { 

j_press=1; 

var obj { 

obj=instance_create(x,y,o_bullet); 
obj.direction=angle; 
obj.speed=15; 







//ЧАСТЬ 2 
if not joystick_check_button(1,2) { 
j_press=0; 


Данный скрипт я разбил на две части для удобства объяснения. Итак, давайте рассмотрим первую часть. Как вы видите, в случае, если j_press=0, при нажатии кнопки 2 выстреливает пуля и переменная j_press принимает значение 1, тем самым не давая выстрелить еще раз. Во второй части, в случае если кнопка 2 не нажата, j_press снова принимает значение 0.

Зачем я так сделал? Дело в том, что Game Maker не позволяет использовать для геймпада функции аналогичные keyboard_check_pressed (нажатие клавиши) и keyboard_check_released (отпуск клавиши). Потому, чтобы выпустить одиночный патрон приходится всячески импровизировать. В моем коде я создал переменную j_press. При нажатии на клавишу 2, она принимает значение 1 и не дает стрелять игроку до тех пор, пока он не отпустит эту кнопку, тем самым вернув j_press значение 0. Вот такая штука…

Один в поле не воин!
А теперь я вам предлагаю руководствуясь инструкциями выше самостоятельно сделать еще одного игрока под второй геймпад. Уверяю, играть на двоих куда веселей. А на этом я с вами прощаюсь. Эм… Делайте и играйте! =D

Категория: Разработка игр | Добавил: BRESS (06.09.2013)
Просмотров: 9343 | Комментарии: 1 | Рейтинг: 4.7/7
Всего комментариев: 1
1 Ilya   (07.07.2014 10:40) [Материал]
Мне нужно только перемещение. Поэтому взял только 1 часть кода. И сразу-же возникла проблема. Персонаж сам двигается вправо (~1-2 пикселей в 5сек) и вверх в 2-3 раза быстрее. Управление плавное, но при передвижение заметна разница в скорости. Вправо быстрее чем влево и вверх быстрее чем вниз. Вроде это происходит из-за (x+=xpos*4;) и (y+=ypos*4;). Как решить эту проблему? Ну или не совсем эту, но все-же как решить?)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]