ジョイパッドに適用させるさて、面倒な前準備も最後です。入力系は最初にやっておかないと後で作ると既存コードをあちこち書き換えないといけないので先にやってしまいます。この章ではジョイパッドコントローラーに適用させます。対応する番号と想定しているボタンの対応がメーカーによってバラバラだということです。PlayStationのコントローラーの〇の位置にあるボタンを押したとしても、PSコントローラーならID「5」で返ってくるが、特定のジョイパッドならID「6」で返ってくる等、バラバラです。ショットボタンは私は△ボタンにしたい、×ボタンにしたい、といったパッドコンフィグにも対応させたいとするとボタンIDと対応するボタンとの対応付けを管理する必要があります。DXライブラリではジョイパッドの入力状態を取得する関数としてGetJoypadInputStateがあります。これは返って来たint型がビットアサインとなっており、16個のボタンを16bitで識別する形になっています。0bit目が0ならID0のボタンの入力はされていない、1ならID0のボタンの入力がされている。1bit目が0ならID1のボタンの入力はされていない、1ならID1のボタンの入力がされている。2bit目が0ならID2のボタンの入力はされていない、1ならID2のボタンの入力がされている。・・・といった具合です。intを2進数で表すと0000000000000000このようになるわけですが、ID2のボタンの入力がされていたら0000000000000100となるわけです。計算する時は、論理積の計算結果が0か0以外かで識別します。(すなわち1<<2)との論理積の計算結果が0なら押されていない、0以外なら押されているという事が分かります。0000000000000100となります。100は10進数で4を意味しますから0以外のためID2は入力されていることが分かります。このようにフィルタする位置0000000000000100この1の位置を一つずつずらしながら論理積を計算することで対応したIDのボタンの入力状態が分かるのです。Padクラスの中身を見てみましょう。_pad[_idArray[eID]];}ePadのenumで使用するボタンを定義します。・変身キーを利用するのでそれを定義しています。updateはKeyboardと同様に1フレームに一度Looperからコールされます。getは必要なクラスから呼び出します。ショットキーが押されているフレーム数を取得したい時はPad::getIns()->get(ePad::shot)こんな形で取得できるわけです。private変数にはまず_idArrayがあります。これはどのIDがどのボタンに対応するかという対応付けの情報を入れます。コンストラクタでは、うちの環境で一番ちょうどいいボタン設定を入れてあります。四聖龍神録2のキーコンフィグ画面で出てくる数値と同じですので、ボタンの対応に何の数値を入れたらいいか分からない人は四聖龍神録2のキーコンフィグで押してみて確認してもよいです。ようするに取れてくるビットアサインの何番目に対応するかという事を意味します。update()ではパッドキーの入力状態を監視し、押されていたら_padをカウントアップします。論理積の部分は先ほど紹介した理屈の通りです。トアサインされている1bitずつ調べて_padに格納しています。mergeは、キーボードとのマージです。ジョイパッドの決定ボタンでも、キーボードのエンターでも同じ動きにしたい時、ジョイパッドの決定ボタンとキーボードのエンターをマージします。マージというと大げさですが、どちらか大きな値を_padに格納しているだけです。maxはstdのalgorismにも、windows.hにも実装のある関数/マクロです。2つの引数の内大きな方を返します。}}これでジョイパッドに対応できました。PCにお使いのジョイパッドを使いで確認してみてください。四聖龍神録2でショットキーに当たるボタンを押すとシーンが変わるはずです。ePad::shotはZキーとエンターキーにマージしていますので、ジョイパッドが無い時はZキーかエンターキーを押しても同じことになります。前準備が終わりましたので、具体的な見える形の作り込みをしていきましょう。