Windowsコード集 上のページ

#0002 汎用デバイス入力クラス

かなり前からあったのですが、ジョイスティックの動作チェックができなかったのでずっとお蔵入りしていたクラスです。
対応デバイスは、キーボード,マウス,ジョイスティック(ポート1のみ)の3つに対応しており、生成以外のメソッドは共通したインターフェースの元で使用する事ができます。 つまり、各デバイス毎にコーディングする必要はありません。

0002.lzh CDirectInputクラス(2KB)
//-----------------------------------------------------------------------------
// directinput.h (一部)
//-----------------------------------------------------------------------------

#include "dinput.h"

// デバイス管理構造体
typedef struct{
    LONG x,y,z;
    BYTE button[3];
}DEVICESTATE;

// クラス
class CDirectInput{
private:
    int m_dtype;
    LPDIRECTINPUT m_dinput;
    LPDIRECTINPUTDEVICE  m_didevice;
    LPDIRECTINPUTDEVICE2 m_didevice2;
    DEVICESTATE m_state;
public:
    CDirectInput():m_dinput(NULL),m_didevice(NULL),m_didevice2(NULL),m_dtype(-1){}
    ~CDirectInput(){Release();}
    BOOL Create(HWND hwnd,int device);
    void Release();
    void Acquire(BOOL f){
        if(m_didevice != NULL){
            if(f){
                m_didevice->Acquire();
            }else{
                m_didevice->Unacquire();
            }
        }
    }
    BOOL GetState();
    BOOL Left(){return (m_state.x < 0);}
    BOOL Right(){return (m_state.x > 0);}
    BOOL Up(){return (m_state.y < 0);}
    BOOL Down(){return (m_state.y > 0);}
    BOOL Trig1(){return (m_state.button[0] != 0);}
    BOOL Trig2(){return (m_state.button[1] != 0);}
    BOOL Trig3(){return (m_state.button[2] != 0);}
    BOOL Trig4(){return (m_state.button[3] != 0);}
};



//
// 以下はCDirectInputの使用例です。
//

// デバイスを生成する -------------------------------------------------------->

CDirectInput dinput;            // クラス生成(グローバル等に定義)

if(!dinput.Create(hwnd,0)){     // デバイスの初期化(必須)
                                // ※ 第2パラメータが使用デバイスの定義になっています。
                                //    0:キーボード
                                //    1:マウス
                                //    2:ジョイスティック(ポート1)
    /*
        初期化失敗
    */
}
dinput.Acquire(TRUE);           // デバイスのアクセス権を得る(必須)


// デバイスの変更 ------------------------------------------------------------>

dinput.Create(hwnd,1);          // 内部でオブジェクトの再構築を行うので、
                                // 開放等の処理を行う必要はありません。

dinput.Acquire(TRUE);           // デバイスのアクセス権を得る(必須)


// デバイス入力 -------------------------------------------------------------->

if(dinput.GetState()){          // デバイスのステータスを得る(必須)

    /*
        ここで、以下のメソッドを使って各方向ボタンやトリガーの状態を取得します。
        全ての返値はTRUEもしくはFALSEなので、if文等でチェックするだけでOKです。

        BOOL Left()     左ボタン
        BOOL Right()    右ボタン
        BOOL Up()       上ボタン
        BOOL Down()     下ボタン
        BOOL Trig1()    トリガー1
        BOOL Trig2()    トリガー2
        BOOL Trig3()    トリガー3
    */

    // 例:左ボタンが押されたかどうかのチェック
    if(dinput.Left()){
        //
        // 押された場合
        //
    }
}


// デバイス開放 -------------------------------------------------------------->

dinput.Release();               // このメソッドはデストラクタに隠蔽して処理を行っているので、
                                // 特殊な事をやらなければ省略しても構いません。




上のページ