コントローラーの処理をお任せにできるクラスを製作中(完成度70%)
DxLib使えばいいんじゃね?とお思いかもしれませんが、うちのPSPコントローラーさんはいくつかのボタンが認識されてくれません(泣)
という事で
DirectInputだ~~!
はい。初めて触っています。
設定がちょいとめんどくさい。もう二度とやりたくないから、ライブラリにしてしまう事を目標にしてます。
どういうものを作りたいかというと、
①キーボード、マウス、ジョイスティック関係なしに、それぞれのボタンや機能を一つの仮想コントローラーのものとしてプログラム側で扱える
②そんなことしてキーコンフィグをプログラム側でやると大変だから、これを外部ファイルに。
③バイナリ形式だとファイルを直接いじるのがめんどくさそうだから、外部ファイルはテキスト形式にする
④
例えば8方向キーを十字キーとして認識したい事(逆もしかり)や、アナログスティックを十字キーとして認識したい事ってあるじゃないですか。
とかキーの数が足りなくって、いくつかのボタン組み合わせて一つのボタンにすることもあるかもしれないじゃないですか。
とかキーボードのスペースキーと、コントローラーのスタートボタンは同じボタンとして認識したいことってあるじゃないですか
とかマウスをアナログスティック的に使いたいこともあるかもしれないじゃないですか(マインクラフトのように)
…取り敢えずこれらの機能を付ける
で、現在どれくらい進んだのかというとマウス関連の処理以外はできました!(チャットで助けて下さった方ありがとうございましたm(_ _)m )
InputManager::Create()で全デバイスを取得
InputManager::Instance()->Initialize()で初期化
InputManager::Release()で全解放
というゆとり仕様
あとはKeyIDという列挙体をプログラム側で用意しボタン番号を格納して
long InputManager::GetKeyState(KeyID) で呼び出せばよいという感じにしました。(他にもアナログスティックの位置を取得する関数を用意したり)
HRESULT LoadKeyConfigFile(const std::wstring& fileName = L"default.dat"); でキーコンフィグファイルを読めます
キーコンフィグ用のファイルはこんな感じ
► スポイラーを表示
CODE:
NUM_OF_NORMAL_OR_POV:16
NUM_OF_ANALOG:2
MAX_NUM_FOR_CHECK:4
00:{TYPE:NORMAL CONNECT:DIK_SPACE ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_08 ONVALUE:0x80 }
01:{TYPE:NORMAL CONNECT:DIK_LSHIFT ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_09 ONVALUE:0x80 }
02:{TYPE:NORMAL CONNECT:M_LEFT ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_01 ONVALUE:0x80 }
03:{TYPE:NORMAL CONNECT:M_RIGHT ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_02 ONVALUE:0x80 }
04:{TYPE:NORMAL CONNECT:M_CENTER ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_00 ONVALUE:0x80 }
05:{TYPE:NORMAL CONNECT:DIK_H ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_03 ONVALUE:0x80 }
06:{TYPE:NORMAL CONNECT:DIK_Q ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_06 ONVALUE:0x80 }
07:{TYPE:NORMAL CONNECT:DIK_A ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_04 ONVALUE:0x80 }
08:{TYPE:NORMAL CONNECT:DIK_Z ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_10 ONVALUE:0x80 }
09:{TYPE:NORMAL CONNECT:DIK_Y ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_07 ONVALUE:0x80 }
10:{TYPE:NORMAL CONNECT:DIK_G ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_05 ONVALUE:0x80 }
11:{TYPE:NORMAL CONNECT:DIK_B ONVALUE:0x80 }, {TYPE:NORMAL CONNECT:J_11 ONVALUE:0x80 }
12:{TYPE:NORMAL CONNECT:DIK_E ONVALUE:0x80 }, {TYPE:POV CONNECT:POV_0 ONVALUE:{35000,1000} }, {TYPE:POV CONNECT:POV_0 ONVALUE:4500 }, {TYPE:POV CONNECT:POV_0 ONVALUE:{31400,31600} }
13:{TYPE:NORMAL CONNECT:DIK_D ONVALUE:0x80 }, {TYPE:POV CONNECT:POV_0 ONVALUE:18000 }, {TYPE:POV CONNECT:POV_0 ONVALUE:13500 }, {TYPE:POV CONNECT:POV_0 ONVALUE:22500 }
14:{TYPE:NORMAL CONNECT:DIK_S ONVALUE:0x80 }, {TYPE:POV CONNECT:POV_0 ONVALUE:27000 }, {TYPE:POV CONNECT:POV_0 ONVALUE:31500 }, {TYPE:POV CONNECT:POV_0 ONVALUE:22500 }, {TYPE:ANALOG_BUTTON CONNECT:{J_lX,J_lY} ONVALUE:{200,1000,-500,500} }
15:{TYPE:NORMAL CONNECT:DIK_F ONVALUE:0x80 }, {TYPE:POV CONNECT:POV_0 ONVALUE:9000 }, {TYPE:POV CONNECT:POV_0 ONVALUE:4500 }, {TYPE:POV CONNECT:POV_0 ONVALUE:13500 }
16:{TYPE:ANALOG CONNECT:{J_lX,J_lY} ONVALUE:NULL }
17:{TYPE:ANALOG CONNECT:{J_lZ,J_lRz} ONVALUE:NULL }
先頭の数字がボタン番号
Typeでそれが実際にはどんなボタンかを指定して、CONNECTでデバイスのボタンへの接続先を指定、ONVALUEはそのボタンがオンになっている時の値です
横に並んでいるの一番外の{}はOR接続。つまりそれらのどのボタンでもいいという事です。CONNECTとONVALUEは&で複数の接続先を指定することで組み合わせボタンに対応できます。
ボタンとして使うアナログスティックや、角度キー(8方向キー)などはONVALUEに範囲を指定することで、ONの時の値を制限できます
・・・と現状こんな感じ。
まだまだ改善点も多そうだから、がんばります^^;