キーボードの入力はできましたが、ゲームパッドでの入力がしたい
それでは簡単なのでゲームパッドにも対応するように変更してみましょう。
input_left = keyboard_check(vk_left) || gamepad_button_check(0, gp_padl);
input_right = keyboard_check(vk_right) || gamepad_button_check(0, gp_padr);
input_up = keyboard_check(vk_up) || gamepad_button_check(0, gp_padu);
input_down = keyboard_check(vk_down) || gamepad_button_check(0, gp_padd);
if(input_left && !input_right)
{
x -= 1;
}
else if(input_right && !input_left)
{
x += 1;
}
if(input_up && !input_down)
{
y -= 1;
}
else if(input_down && !input_up)
{
y += 1;
}
追加された部分はgamepad_button_check()
関数です。
論理演算子は変数に代入する際にも使えますので、「キーボードの〇キーが押されたか、ゲームパッドの〇キーが押された場合true
」という内容になります。
第一引数で指定しているのはデバイス番号です。
1個目のゲームパッを検出したい場合は0
を指定し、2個目のゲームパッドを検出したい場合は1
を指定する…という指定方法になります。
第二引数で指定するのは『定数』(すでに定義されていて変更不可能な値)です。
定数一覧は以下になります。
定数 | 説明 |
---|---|
gp_face1 | Xbox 360コントローラーA PS4コントローラー× |
gp_face2 | Xbox 360コントローラーB PS4コントローラー〇 |
gp_face3 | Xbox 360コントローラーX PS4コントローラー□ |
gp_face4 | Xbox 360コントローラーY PS4コントローラー△ |
gp_shoulderl | LBボタン(L1ボタン) |
gp_shoulderlb | LT(L2ボタン) |
gp_shoulderr | RBボタン(R1) |
gp_shoulderrb | RT(R2ボタン) |
gp_select | PS4コントローラー PSボタン |
gp_start | PS4コントローラー Optionボタン |
gp_stickl | 左スティック 押し込み |
gp_stickr | 右スティック 押し込み |
gp_padu | 上方向パッド |
gp_padd | 下方向パッド |
gp_padl | 左方向パッド |
gp_padr | 右方向パッド |
gp_axislh | 左スティックの横軸(アナログ) |
gp_axislv | 左スティックの縦軸(アナログ) |
gp_axisrh | 右スティックの横軸(アナログ) |
gp_axisrv | 右スティックの縦軸(アナログ) |
これはゲームパッドの十字ボタンを検出しています。
スティック操作の場合は以下のようになります。
input_left = keyboard_check(vk_left) || gamepad_axis_value(0, gp_axislh) < -0.3;
input_right = keyboard_check(vk_right) || gamepad_axis_value(0, gp_axislh) > 0.3;
input_up = keyboard_check(vk_up) || gamepad_axis_value(0, gp_axislv) < -0.3;
input_down = keyboard_check(vk_down) || gamepad_axis_value(0, gp_axislv) > 0.3;
// 以下省略
gamepad_axis_lh
およびgamepad_axis_lv
は左スティックの横軸・縦軸を意味します。
横軸・縦軸は-1~1の間で返されます。
これは座標の方向を表しているため、-1
であればX軸は左・Y軸は上方向になります。0
の場合は入力されていない(スティックが倒されていない)状態になります。
しかしゲームパッドのスティックは、かなり繊細なため、0
にならない場合があります。 (-0.01
~0.01
程度揺らいだりします)
その場合に備えて、GMS2はgamepad_set_axis_deadzone()
関数を用意しています。
試しに使用するためoPlayer
のCreate Event
に以下のコードを書いてみましょう。
gamepad_set_axis_deadzone(0, 0.05);
これで、0.05
以下の数値はすべて0
と見なされます。
これは1度指定すれば以降ずっと有効となるためStep Event
で指定する必要はありません。