DirectInputに挑戦してみた
オワタ
SIXAXISの加速度センサ等の情報をDirectInputで取得できないかとがんばってみましたが、さっぱりお手上げでした。○| ̄|_
過程で得たものが多少ありますので、それでも公開してみることにします。
作ってみた
DirectInputでジョイスティック(ゲームコントローラ)の情報を取得するサンプルを作ってみました。
簡単にするため、コマンドプロンプトで実行できるようになってます。
その他、普通しなくていいことですがDIOBJECTDATAFORMAT構造体が自前だったりとかしています。
興味ある方はご覧ください。大したことないです。orz
念のため…。
このページで紹介しているプログラムを使用したことによって何らかの不具合などが発生しても、私は一切の責任を負いません。
全てにおいて自己責任で対処してください。
環境を用意する
用意するもの:
・Visual C++ 2008(Express Editionでかまいません。)
・DirectX SDK(入手元はGoogleで検索してください。)
・正常に動作するジョイスティック(ゲームコントローラ)。
・dxpad_sample.cpp(ダウンロードしておいてください。)
作り方
- VC++を起動します。
- メニュー:ファイル → 新規作成 → プロジェクト
新しいプロジェクト ダイアログが開きます。 - プロジェクトの種類:Win32
テンプレート:Win32コンソールアプリケーション
プロジェクト名:dxpad(任意でok。ここでは説明のためdxpadと付けた。) - OKをクリック。
Win32アプリケーションウィザード ダイアログが開きます。 - 次へをクリック。
- コンソールアプリケーションがチェックされていることを確認して、完了をクリック。
- dxpad.cppの内容を全部削除してsample.cppの内容を貼り付ける。
- ソリューションエクスプローラから、dxpadを右クリック → プロパティ
dxpadプロパティページが開く。 - 構成プロパティ → 全般
文字セット:マルチ バイト文字セットを使用する - OKをクリック。
- ビルド → ソリューションのビルド
成功すると次のメッセージが表示される。
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
失敗したら手順をもう一度確認する。 - ジョイスティック(ゲームコントローラ)をPCに接続する。
- メニュー:デバッグ → デバッグ開始
コマンドプロンプトのウィンドウが開いてプログラムが実行されます。 - ジョイスティックを適当に操作してみて、値に反応があったら成功です。
ジョイスティックが2個以上つながっている場合はどれか1個だけに反応します。 - キーボードで適当なキーを押すと終了します。
終了は「×」ボタンではなく、必ずキーボードで適当なボタンを押して終了してください。
ちょっとだけ解説?
正直なところほとんど理解していません。
したがって解説らしい解説は出来ませんのでご了承ください。
排他制御(ウィンドウが非アクティブのときは入力を受け付けなくする処理)は上手くいかなかったので省略しています。
DIJOYSTATE3 構造体はDIJOYSTATE2 構造体と同じものです。
c_rgodfDIJoystick3 構造体はc_dfDIJoystick2 構造体と同じものです。(推定)
通常はc_dfDIJoystick2構造体があるので自分で作成する必要はないのですが、特殊なことをしようとしていたのでここまで調べてみました。
が、なにがどうなっているのやら…あきらめました。
複数のジョイスティックへの対応については、あんまり調べてないので分かりません。
見つかった1個目のジョイスティックデバイスの情報を取得するようになっています。
DirectInputに挑戦してみた
DirectInputって特殊なデバイスを使おうとするとやたらと難しい上に資料ないですね。Wiimote方面でも探してみたけど見当たらなかった。
そもそも無理なのかな?…それすらわからない。
あきらめて普通にReadFile関数でやるしかないか…。
一つ分かったこととして、ジョイスティックを使う場合、コールバックが必要です。
そのためHSPでジョイスティックのフォースフィードバックに対応させるにはプラグイン化が必須(モジュールだけでは不可能)になります。