libGDXとはWindows、Linux、Mac、Android、iPhone、HTMLに対応したクロスプラットフォームゲームライブラリです。有名なIngressでも利用されています。欧米ではわりとメジャーどころです。
#ゲームパッドを使いたい
キーボードやマウス、タッチパネルなどでもゲームはできますが、アクション系に関してはやはり物理的にゲームに適したインターフェースである、ゲームパッド、ジョイスティックといったインターフェースも対応したいことはかなりあります。
今回はそれを使う方法を解説します。
#対応プラットフォーム
libGDXにはコントローラエクステンションがあり、対応しているプラットフォームはDesktop(Windows、Mac、Linux)とAndroid、そしてHTMLです。現時点ではiOSは対応していません。
手元ではパッドが使える環境はPCしかないため、Desktopのみで解説します。
#まずはゲームパッドの動作確認
コードを書く前にパッドがちゃんとOSから認識されているか確認しましょう。
たとえばWindowsであればコントロールパネルから確認可能です。
どのボタンを押したらどう動くかは把握しておいてください。
これはPS2のパッドの変換器です。この変換器でマッピングされるボタンは以下のようになっています。
マッピングは右側のボタン4つはそれぞれボタン1-4。
L2、R2、L1、R1がボタン5-8。
スタートボタンとセレクトボタンがそれぞれ9と10。
アナログレバーの押し込みがボタン11と12です。
XとYはデジタルでそれぞれ-1、0、1を表していて、X軸は0がニュートラル、-1が左、1が右を表しています。Y軸は上が-1で0がニュートラル、1が下です。
アナログモードにすると左アナログレバーの入力が可能になり、XとYは-1から1の間の微妙な数値が出るようになります。
右アナログレバーは左右方向に動かすとZ軸、上下方向に動かすとZ回転に割り当てられています。が、ContollerからはZ軸の方しか正常に取得できていないようですので右アナログレバーは無視することにします。
#セットアップ
libgdxのgdx-setup.jarを起動すると利用するエクステンションをチェックボックスで設定できます。ここにコントローラがあるのでこれにチェックをするとライブラリは組み込まれた形ですぐに利用できます。
すでにセットアップ済みの場合はbuild.gradleの依存に以下の行を追加します。
coreの依存箇所
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
desktopの依存箇所
compile "com.badlogicgames.gdx:gdx-controllers-desktop:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers-platform:$gdxVersion:natives-desktop"
antなどの場合はアーカイブのextensions/gdx-controllersにある各種実装を追加してください。gdx-controllers.jarはAPIインターフェースですのでこちらをcore部分に追加してください。
#プログラム
##接続されているゲームパッド一覧を取得する
Array<Controller> controllers = Controllers.getControllers();
##名前を取得する
String name = controller.getName();
##十字キーの状態取得
//十字キーの左右(-1.0 ~ 1.0)
float axis = controller.getAxis(3);
if(Math.abs(axis) > 0.5f ){
System.out.println("X="+axis);
}
//十字キーの上下(-1.0 ~ 1.0)
float axis = controller.getAxis(2);
if(Math.abs(axis) > 0.5f ){
System.out.println("Y="+axis);
}
自分の環境では3と2がそれぞれX軸とY軸でした。
##ボタンを押しているかどうか調べる
//1つ目のボタン
boolean isPress = controller.getButton(0);
if(isPress){
System.out.println("1ボタン");
}
##イベント
ポーリングではなくイベントで取得したい場合は以下のようになります。ControllerAdapterはControllerListenerの空実装なのでこれを継承してイベント処理をしたいところだけオーバーライドしてください。
controller.addListener(new ControllerAdapter(){
@Override
public boolean axisMoved(Controller controller, int axisIndex, float value) {
System.out.println("axis "+axisIndex+"="+value);
return true;
}
@Override
public boolean buttonDown(Controller controller, int buttonIndex) {
System.out.println("button down="+buttonIndex);
return true;
}
@Override
public boolean buttonUp(Controller controller, int buttonIndex) {
System.out.println("button up="+buttonIndex);
return true;
}
});
パッドの抜き差しもあるのですが、自分の環境ではイベントで取れませんでした。
ボタンのIDなどはOUYAのみマッピングはすでに用意されているようです。