ジョイパッド入力はさくっと完成はしたものの、APIとしてどうかという点で気になるところがある。
一応現時点では以下のような感じで簡単にジョイパッドが使える。ShinGL3ほどプリミティブではないけど、まぁおなじ感じ。違いは複数のパッドを認識できるようにしたくらい。格闘ゲームとか同時プレイも遊べるようにね。
//ジョイパッドの取得 SGJoyPad[] pads = SGInput.getJoyPad(); //8方向レバーの取得。戻り値はテンキーの数字 System.out.printf("stick:%d%n" ,pads[0].getStick()); //ボタンの押下状態の取得。とりあえずボタン8個まで認識 for(int i=0;i<8;i++){ System.out.printf("strig[%d]:%b%n" , i , pads[0].isTrigger(i)); }
一見問題ないように見えるが、当たり前だけど上記コードはパッドがつながってないと配列のサイズは0になるためエラーが出てしまう。
ほかにもパッドが2つつながっていた場合、一人用のゲームはどちらでも動くようにしたいとかよくあること。
その場合この可変配列でパッドを戻すのが問題だなぁと。
MSXやX68000等ではパッドの接続状態によって変化するものではなかったはず。つまり、接続されていなければパッドが接続されているかどうかは気にせず常に押下状態がfalseとして、返せばよいということ。
パッドの最大数を4つとかに絞って配列長を固定化させようかなと。
また、ShinGL3のように、というかMSXのようにジョイスティック番号0をキーボードにするかどうか。
こうなってくると境界例外が発生する配列はやめて、引数として数字を渡したほうがよいな。ジョイパッド番号をいくらでも好きな数字まで許すけど、その結果戻ってきたSGJoyPadのインスタンスのメソッドは常にfalseをかえすようなものであるかもしれない、と。ソースにすると以下のようになる。
//ジョイパッド番号1番を取得 SGJoyPad pad = SGInput.getJoyPad(1); //8方向レバーの取得。戻り値はテンキーの数字 System.out.printf("stick:%d%n" ,pad.getStick()); //ボタンの押下状態の取得。とりあえずボタン8個まで認識 for(int i=0;i<8;i++){ System.out.printf("strig[%d]:%b%n" , i , pad.isTrigger(i)); }
最初の方法だと配列の場合パッド接続数はそのサイズで取得できるが、この方法だと取得できないので認識できたパッド数を取得するメソッドが必要になる。
まじめに初心者でも使えるAPIを考えるって難しいけど、こういうことをクリアしていかないとダメだろうね。
ボタンの押下状態も最初はbooleanの配列だったけど、これも使い勝手を考慮して今の姿になった。存在しないボタン番号をセットしても問題が起きないように。
ダンジョンマスターのように1台で複数人で同時プレイできるアクションRPGっていいよね。コンシューマ的に言えばダンジョンエクスプローラーあたりかな。