7-4 CDIPro81クラスを使おう!

CDIProクラスとはDirectInputをもっと簡単に扱えるようにしたライブラリです。
このクラスはDirectX8.1を想定しているためCDIPro81という名前になっていますが、
別名でCDIProとも定義されているためどちらの名前を使用しても問題ありません。
※DirectInputは8が最後のバージョンです


このソースコードは自由に改変して使用できます。
その際、有償無償関係なく使用できますが、もしバグがあった場合は責任は取れませんので、
十分デバッグしてから利用してください。


このクラスはマウス、キーボード、ジョイスティックに対応していますが、
ジョイスティックのフィードバックには対応していません。


■何が出来るの?

このクラスでは以下のことが行えます。

1.DirectInput8、DirectInputDevice8の管理
2.キーボード入力情報の取得
3.マウス入力情報の取得(相対モード)
4.接続されている全てのジョイスティック入力情報の取得
5.接続されているジョイスティック数の取得
6.接続されているジョイスティック名称の取得
7.キーボードデバイスを作成しなかった場合はGetKeyboardStateにてエミュレート
8.デバイスが停止しても自動的に回復

このクラスを使用するとキーボードやマウスの入力はもちろん、
面倒なジョイスティックの列挙処理を内部で行っているため、
ほとんど知識は必要とせずジョイスティック入力が可能になります。

またジョイスティックの名称を取得する関数が用意されているため、
名前から特定のジョイスティックのみを使用するという使い方も出来ます。

このクラスは#pragma命令により自動的にdinput8.libなどのライブラリにリンクするようになっています。

■CDIPro81のダウンロード

CDIPro81ライブラリ v2.01 CDIPro81_v2.01.zip

サンプルプログラムなどで使用しているライブラリはこれより古い可能性があるため、
最新版は常にこちらからダウンロードするようにしてください。

■サンプルプログラム

ここではCDIProクラスを使ったサンプルを見てみましょう。

サンプルのダウンロード

VisualStudio2010のプロジェクト
※VC2012、VC2013はこちら
CDIProSample_vs2010.zip
VisualStudio2015のプロジェクト CDIProSample_vs2015.zip

プログラム解説


このサンプルプログラムはキーボード、マウス、1つ目のジョイスティックの状態を画面に表示します。
なおジョイスティックが接続されていない場合でも、マウスとキーボードの状態を確認することは出来ます。

まずはCDIPro81.hをインクルードします。

#include "CDIPro81.h"


次にこのクラスをグローバル変数として実体を定義します。

CDIPro81	di;						// DirectInput


あとはWinMainにてこのライブラリの初期化を行います。
なお初期化にはウィンドウハンドルが必要なため、先にウィンドウを作成しておく必要があります。

    // DirectInput
    if( !di.Create(win.hWnd,win.hInstance) )
        return -1;


次に使用するデバイスごとに初期化を行いますが、ここではキーボード、マウス、ジョイスティック全てを使用するため、
それぞれの初期化を呼び出しています。

    // キーボードデバイスを作成
    di.CreateKeyboard();

    // マウスデバイスを作成
    di.CreateMouse();

    // ジョイスティックデバイスを作成
    di.CreateJoystick();

これらの関数は構築に失敗したらFALSEが返るので普通はエラーを出して終了させますが、
このライブラリはエラーだった場合でも特に問題無く動作するように設計されているため、
ここではエラーチェックは行っていません。

またキーボードデバイスに関しては、初期化を行わなかった場合や初期化に失敗した場合は
GetKeyboardStateにてエミュレーションされるため、
キーの入力に関してはどのような場合でも取得することが出来るようになっています。

これで初期化が終わったので、あとはメインループにてこれらの値を取得して判定などで使用するだけです。

    MSG msg;
    while(1) {

        :

        ////////////////////////////////////////////////////////
        // 入力
        ////////////////////////////////////////////////////////

        // キーボードを取得
        BYTE key[256];
        di.GetKeyboard( key );

        // ESCAPEなら終了
        if( key[DIK_ESCAPE]&0x80 )
            break;

        // マウスを取得
        DIMOUSESTATE mouse;
        di.GetMouse( &mouse );

        // ジョイスティックを取得(1つ目のみ)
        DIJOYSTATE2 joy;
        di.GetJoystick( &joy,0 );

        ////////////////////////////////////////////////////////
        // 描画
        ////////////////////////////////////////////////////////

        :

        Sleep(15);
    }

注意点としてこのライブラリのジョイスティックのデータフォーマットは、
DIJOYSTATEではなくDIJOYSTATE2となっています。

ちなみにマウスやジョイスティックの初期化に失敗していた場合、返される値は必ず未入力状態としてクリアされています。
このため入力処理の判定時には未操作状態として処理することが出来るようになっています。

最後に終了前にDeleteを呼び出して終了します。

    di.Delete();
    win.Delete();

    return 0;
}



このようにCDIProライブラリを使用することで、特に難しいことを考えずとも
キーボードからジョイスティックまで簡単に扱うことが出来るようになっています。