ゲームコントローラーを使ってみる

キーボードの入力はできましたが、ゲームパッドでの入力がしたい

それでは簡単なのでゲームパッドにも対応するように変更してみましょう。

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_face1Xbox 360コントローラーA PS4コントローラー×
gp_face2Xbox 360コントローラーB PS4コントローラー
gp_face3Xbox 360コントローラーX PS4コントローラー
gp_face4Xbox 360コントローラーY PS4コントローラー
gp_shoulderlLBボタン(L1ボタン)
gp_shoulderlbLTL2ボタン)
gp_shoulderrRBボタン(R1
gp_shoulderrbRTR2ボタン)
gp_selectPS4コントローラー PSボタン
gp_startPS4コントローラー 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.010.01程度揺らいだりします)

その場合に備えて、GMS2はgamepad_set_axis_deadzone()関数を用意しています。
試しに使用するためoPlayerCreate Eventに以下のコードを書いてみましょう。

gamepad_set_axis_deadzone(0, 0.05);

これで、0.05以下の数値はすべて0と見なされます。
これは1度指定すれば以降ずっと有効となるためStep Eventで指定する必要はありません。

もどる