Так как игры, разрабатываемые на 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 пишем:
Теперь снова переходим к событию 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
|