DirectInputサンプルプログラム

MSSDKのDirectDraw関係のサンプルにはddutil.cppという、DirectDrawの汎用関数(?)を まとめたプログラムがあるが、何故かDirectInput関係のサンプルには無いので、diutil.cpp という名前で 作ってみました。

ジョイスティックが刺さっているときにはジョイスティックからのみ状態を取得し、 刺さっていないときにはキーボードから状態を取得するバージョンと、ジョイスティックが 刺さっているときはジョイスティックとキーボードの両方から状態を取得し、刺さっていない 場合はキーボードから状態を取得するバージョンを作成しました。
とはいえ、これはDirectInputの初期化のところでif文をチョコット変えるだけなので誰でも できると思います。
前者のバージョンのソースをdiutil1.lzh、 後者のソースをdiutil2.lzhとして圧縮してありますので、 興味のある人は一度覗いてみてください。

このプログラムは、ジョイパッドを使ったゲームを作るために作成したものです。 ですからキーボードの状態を取得するといってもすべてのキーの状態を取得するものではなく、 ジョイパッドのボタンの変わりに指定したキーの状態だけを取得します。
キーの対応は次のようにしました。

パッド キーボード プログラム内
A A BUTTON_A
B B BUTTON_B
C C BUTTON_C
X X BUTTON_X
Y Y BUTTON_Y
Z Z BUTTON_Z
L L BUTTON_L
R R BUTTON_R
START ENTER BUTTON_START
M M BUTTON_M
LEFT LEFT BUTTON_LEFT
RIGHT RIGHT BUTTON_RIGHT
UP UP BUTTON_UP
DOWN DOWN BUTTON_DOWN

どちらの圧縮ファイルも解凍するとdiutil.hdiutil.cppというファイルが出てきます。
使い方は 次のとおりです。

  1. DirectInputを使えるようにプロジェクトの設定を変更する。
    1. 「プロジェクト」→「設定」を選択
    2. 「リンク」タブをクリックし、「オブジェクト/ライブラリ モジュール」に dinput.libライブラリを追加
    3. 追加したら「OK」ボタンをクリック
  2. 2つのファイルを自分のプロジェクトにインポートする。
  3. 自分のソースプログラムにdiutil.hをインクルード する。
    #include "diutil.h"
  4. DirectDrawの初期化後、DirectInputオブジェクトの初期化を行う
    /* DirectInputオブジェクトの初期化 */
    if ( InitDInput( hThisInst, hWnd ) != true ) return FALSE;
  5. ジョイパッド又はキーボードの状態を取得したいところ(UpdateFrameあたり?)で 次の行を 追加する。
    DWORD dwInput;
    dwInput = GetInputDeviceState();
  6. GetInputDeviceState関数を実行することにより、dwInput にジョイパッド又はキーボードの状態が格納される。
  7. dwInputの状態を調べる。例えばジョイパッドの十字キーの上(又はキーボードのカーソルキーの上) が 押されているかを調べるには次のように行う。
    if ( dwInput & BUTTON_UP ) {
    // 押されているときの処理
    } else {
    // 押されていないときの処理
    }
  8. プログラム終了時、DirectInputオブジェクトを開放する。
    (case WM_DESTROY:内のReleaseDraw();の前)
    /* DirectInputオブジェクトの開放 */
    ReleaseDInput();

こんな感じなんですけど・・・説明って難しい。もしどなたかこれを試したら、 結果を教えて頂けないでしょうか?もっと判りやすくしたいので。