2009年2月25日水曜日

C#でジョイスティックをいじってみた

タイトルの通り、
ジョイスティック(=ゲームパッド)をいじってみた。

ジョイスティックを使う手段としての選択肢は
・DirectInput
・SDL
・Win32 API (winmm.dll)
あたりだろうか。

OpenGLを使ってるので、
それと一緒にDrectXを使うってのも変なので
DirectInputは、無しで。

SDLとwinmm.dllは、
どっちもTaoを使えばC#から簡単に使える。

Win32 API を使うと、
ジョイスティックの入力イベントのメッセージが
ウィンドウに飛んでくるようにできるらしいので、
そのメッセージを処理すれば
マウスイベントとかと同様に
ジョイスティックイベントをFormに実装できるかなー、
と目論んで、
winmm.dllからジョイスティック関連の関数を呼び出して
いじってみることにした。

という事で、
まずはwinmm.dllからの関数のインポート。
こういう時に便利なのがここ(Pinvoke.net)なんだけど、
どういうわけか、ジョイスティック関連のAPIが見あたらない。
ってことで、やっぱりTao.Platform.Windows.dllを使うのが一番手っ取り早いかも。

Tao.Platform.Windows.dll の中に、
そのまんま "Winmm" という名前のラッパークラスがあり、
ここにジョイスティック関連のAPIがインポートされてる。
っていうか、このクラスにはほとんどそれぐらいしか無いっぽい。

ジョイスティック関連のAPIの使い方は、
ここがわかりやすいかも。
http://fyhpld.hp.infoseek.co.jp/develop.htm

ジョイスティックをキャプチャすると
ウィンドウにジョイスティックのイベントメッセージが飛んでくるようになるので、
あとは、そのメッセージの処理ルーチンを自前で
ウインドウプロシージャに加えてやればよい。
.NETのコントロールとかフォームだと、
ウインドウプロシージャに相当する
void WndProc( ref Message m )
というメソッドがあるので、
これをオーバーライドしてやればOK。

・・・なんだけど、
TaoのWinmmクラスに定義されてる
ジョイスティック関連のメッセージ(MM_JOY1MOVEとか)、
なんか、ボタンイベントのメッセージ(MM_JOY1BUTTONDOWNとか)が
ぬけてるっぽいな・・・。

あとは、
たとえば、"JoysticMove" みたいな名前でイベントを用意して、
オーバーライドしたWndProcメソッドから
メッセージに応じてイベントを呼び出すようにしてやれば、
マウスイベントと同様に、ジョイスティックイベントが実装できるはず。