④サンプルプログラム(BlueInput.cpp)

#include "StdAfx.h"
#include "BlueInput.h"
#include
#include

#pragma comment ( lib, "dinput8.lib" )
#pragma comment ( lib, "dxguid.lib" )

// 実験用
LPDIRECTINPUTEFFECT g_pDIEffect[MAX_JOYSTICK];

CBlInput::CBlInput( void )
{
m_pDInput = NULL;
m_pDInputDevMouse = NULL;
m_pDInputDevKeyboard = NULL;
for( int i = 0; i < MAX_JOYSTICK; ++i ){
m_pDInputDevJoystick[i] = NULL;
}

m_nJoystickCount = 0;

ZeroMemory( m_lMouseAxis, sizeof(m_lMouseAxis) );
ZeroMemory( m_btMouseButton, sizeof(m_btMouseButton) );
ZeroMemory( m_btKeyData, sizeof(m_btKeyData) );
ZeroMemory( m_dwJoystickButton, sizeof(m_dwJoystickButton) );
ZeroMemory( m_lJoystickAxis, sizeof(m_lJoystickAxis) );
ZeroMemory( m_dwJoystickPOV, sizeof(m_dwJoystickPOV) );

m_dwPolling = 0;

// 実験用
ZeroMemory( g_pDIEffect, sizeof( g_pDIEffect ) );
}

/****************************************************************
引数: hInst アプリのインスタンスハンドル
戻り値: 成功 TRUE
失敗 オブジェクトが既に作成されている FALSE
説明: DirectInput初期化

***************************************************************/

BOOL CBlInput::InitDxInput( const HINSTANCE &hInst )
{
BOOL bRet = TRUE;

try{
if( m_pDInput != NULL ){
throw FALSE;
}
HRESULT hr = 0;
// DirectInputオブジェクト作成
hr = DirectInput8Create(
hInst,
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(LPVOID*)&m_pDInput,
NULL);

if FAILED( hr ){
throw FALSE;
}
}
catch( BOOL bFlag ){
bRet = bFlag;
}

return bRet;
}

/****************************************************************
引数: なし
戻り値: なし
説明: DirectInput解放

***************************************************************/

void CBlInput::Release( void )
{
// マウスデバイス解放
ReleaseMouse();

// キーボードデバイス解放
ReleaseKeyboard();

// ジョイスティックデバイス解放
ReleaseJoystick();

// 実験用
for( int i = 0; i < MAX_JOYSTICK; ++i ){
if( g_pDIEffect[i] != NULL ){
g_pDIEffect[i]->Unload();
}
}

// DirectInput8オブジェクト解放
if( m_pDInput != NULL ){
m_pDInput->Release();
}
}

/****************************************************************
引数: hInst アプリのインスタンスハンドル
hWnd アプリのウィンドウハンドル
戻り値: 成功 0
DxInputオブジェクト作成失敗 DLINP_ERROR_CREATE
マウスデバイス作成失敗 MOUSE_ERROR_CREATE
データフォーマット設定失敗 MOUSE_ERROR_DATAFORMAT
協調モードの設定 MOUSE_ERROR_MODE
軸モード設定 MOUSE_ERROR_AXIS
説明: マウスモード初期化

***************************************************************/

DWORD CBlInput::InitMouse( const HINSTANCE &hInst, const HWND &hWnd )
{

DWORD dwRet = 0;

try{
if( m_pDInput == NULL ){
if( InitDxInput( hInst ) == FALSE ){
throw BLINP_ERROR_CREATE;
}
}
HRESULT hr = 0;

ReleaseMouse();

// マウス用のデバイス作成
hr = m_pDInput->CreateDevice(
GUID_SysMouse,
&m_pDInputDevMouse,
NULL);
if FAILED( hr ){
throw MOUSE_ERROR_CREATE;
}

// データフォーマットの設定
hr = m_pDInputDevMouse->SetDataFormat( &c_dfDIMouse2 ); // xyz(ホイール)軸と8つのボタン
if FAILED( hr ){
throw MOUSE_ERROR_DATAFORMAT;
}

// 協調モードの設定
hr = m_pDInputDevMouse->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE ); // フォアグラウンド、非排他モード
if FAILED( hr ){
throw MOUSE_ERROR_MODE;
}

// 軸モードの設定
DIPROPDWORD diprop;
diprop.diph.dwSize = sizeof( diprop );
diprop.diph.dwHeaderSize = sizeof( diprop.diph );
diprop.diph.dwObj = 0;
diprop.diph.dwHow = DIPH_DEVICE;
diprop.dwData = DIPROPAXISMODE_REL; // 相対モード
hr = m_pDInputDevMouse->SetProperty( DIPROP_AXISMODE, &diprop.diph );
if FAILED( hr ){
throw MOUSE_ERROR_AXIS;
}

// デバイス入力制御開始
m_pDInputDevMouse->Acquire(); // フォアグラウンドモードの為、フォーカスを失うと制御が止まるので注意
}
catch( DWORD dwError ){
dwRet = dwError;
ReleaseMouse();
}

return dwRet;
}

/****************************************************************
引数: hInst アプリのインスタンスハンドル
hWnd アプリのウィンドウハンドル
戻り値: 成功 0
DxInputオブジェクト作成失敗 DLINP_ERROR_CREATE
キーボードデバイス作成失敗 KEYBOARD_ERROR_CREATE
データフォーマット設定失敗 KEYBOARD_ERROR_DATAFORMAT
協調モードの設定 KEYBOARD_ERROR_MODE
説明: キーボードモード初期化

***************************************************************/

DWORD CBlInput::InitKeyboard( const HINSTANCE &hInst, const HWND &hWnd )
{
DWORD dwRet = 0;

try{
if( m_pDInput == NULL ){
if( InitDxInput( hInst ) == FALSE ){
throw BLINP_ERROR_CREATE;
}
}
HRESULT hr = 0;

ReleaseKeyboard();

// キーボード用のデバイス作成
hr = m_pDInput->CreateDevice(
GUID_SysKeyboard,
&m_pDInputDevKeyboard,
NULL);
if FAILED( hr ){
throw KEYBOARD_ERROR_CREATE;
}

// データフォーマットの設定
hr = m_pDInputDevKeyboard->SetDataFormat( &c_dfDIKeyboard ); // キーボード用のフォーマット 256バイトの配列
if FAILED( hr ){
throw KEYBOARD_ERROR_DATAFORMAT;
}

// 協調モードの設定
hr = m_pDInputDevKeyboard->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE ); // フォアグラウンド、非排他モード
if FAILED( hr ){
throw KEYBOARD_ERROR_DATAFORMAT;
}

// デバイス入力制御開始
m_pDInputDevKeyboard->Acquire(); // フォアグラウンドモードの為、フォーカスを失うと制御が止まるので注意
}
catch( DWORD dwError ){
dwRet = dwError;
ReleaseKeyboard();
}

return dwRet;
}

/****************************************************************
引数: hInst アプリのインスタンスハンドル
hWnd アプリのウィンドウハンドル
nNum 使用できるジョイスティックの最大数
pnSetNum 実際に確保できたジョイスティックの数(接続数ではない) NULL可
戻り値: 成功 0
DxInputオブジェクト作成失敗 DLINP_ERROR_CREATE
ジョイスティック列挙失敗 JOYSTICK_ERROR_ENUM
説明: ジョイスティック初期化

***************************************************************/

DWORD CBlInput::InitJoystick( const HINSTANCE &hInst, const HWND &hWnd, const int nNum, int *pnSetNum )
{
DWORD dwRet = 0;
HRESULT hr = 0;
if( pnSetNum != NULL ){
*pnSetNum = 0;
}

try{
if( m_pDInput == NULL ){
if( InitDxInput( hInst ) == FALSE ){
throw BLINP_ERROR_CREATE;
}
}

ReleaseJoystick();

// ジョイスティックの列挙
hr = m_pDInput->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, (void*)this, DIEDFL_ATTACHEDONLY );
if FAILED(hr){
throw JOYSTICK_ERROR_ENUM;
}

// ジョイスティックの初期化
for( int i = 0; i < m_nJoystickCount; ++i ){
// データフォーマットの設定
hr = m_pDInputDevJoystick[i]->SetDataFormat( &c_dfDIJoystick2 ); // フォースフィードバックにも対応
if FAILED(hr){
m_pDInputDevJoystick[i]->Release();
m_pDInputDevJoystick[i] = NULL;

continue;
}

// 協調モードの設定
hr = m_pDInputDevJoystick[i]->SetCooperativeLevel( hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND ); // フォアグラウンド、排他モード
if FAILED(hr){
m_pDInputDevJoystick[i]->Release();
m_pDInputDevJoystick[i] = NULL;

continue;
}

// オートセンター設定
DIPROPDWORD dipdw;
ZeroMemory( &dipdw, sizeof( dipdw ) );
dipdw.diph.dwSize = sizeof( dipdw );
dipdw.diph.dwHeaderSize = sizeof( dipdw.diph );
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = DIPROPAUTOCENTER_OFF;

hr = m_pDInputDevJoystick[i]->SetProperty( DIPROP_AUTOCENTER, &dipdw.diph );

// 軸モードの設定
hr = m_pDInputDevJoystick[i]->EnumObjects( EnumAxesCallback, (void*)m_pDInputDevJoystick[i], DIDFT_AXIS );
if FAILED(hr){
m_pDInputDevJoystick[i]->Release();
m_pDInputDevJoystick[i] = NULL;

continue;
}

// デバイス情報取得
DIDEVCAPS caps;
ZeroMemory( &caps, sizeof( caps ) );
caps.dwSize = sizeof( DIDEVCAPS );
m_pDInputDevJoystick[i]->GetCapabilities( &caps );

// ポーリングが必要かを調べる
if( caps.dwFlags & (DIDC_POLLEDDATAFORMAT & DIDC_POLLEDDEVICE) ){
m_dwPolling |= (0x00000001UL << i);
}

// デバイス入力制御開始
m_pDInputDevJoystick[i]->Acquire(); // フォアグラウンドモードの為、フォーカスを失うと制御が止まるので注意

// 実験
DICONSTANTFORCE diCForce;
diCForce.lMagnitude = DI_FFNOMINALMAX;

DIENVELOPE diEnvelope;
diEnvelope.dwSize = sizeof( DIENVELOPE );
diEnvelope.dwAttackLevel = 0;
diEnvelope.dwAttackTime = (DWORD)(0.5 * DI_SECONDS );
diEnvelope.dwFadeLevel = 0;
diEnvelope.dwFadeTime = (DWORD)(1.0 * DI_SECONDS );

DIEFFECT diEffect;
diEffect.dwSize = sizeof( DIEFFECT );
diEffect.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS;
diEffect.dwDuration = INFINITE;
diEffect.dwSamplePeriod = 0;
diEffect.dwGain = DI_FFNOMINALMAX;
diEffect.dwTriggerButton = DIEB_NOTRIGGER;
diEffect.dwTriggerRepeatInterval = 0;
diEffect.cAxes = 2;
DWORD dwAxes[2] = { DIJOFS_X, DIJOFS_Y };
diEffect.rgdwAxes = dwAxes;
long lDirection[2] = { 5, 5 };
diEffect.rglDirection = lDirection;
diEffect.lpEnvelope = 0;
diEffect.cbTypeSpecificParams = sizeof(diCForce);
diEffect.lpvTypeSpecificParams = &diCForce;
diEffect.dwStartDelay = 0;
hr = m_pDInputDevJoystick[i]->CreateEffect( GUID_ConstantForce,
&diEffect,
&g_pDIEffect[i],
NULL );

if SUCCEEDED( hr ){
hr = DIERR_NOTEXCLUSIVEACQUIRED;
hr = g_pDIEffect[i]->Start( 1, 0 );
hr = hr;
}
}
}
catch( DWORD dwError ){
dwRet = dwError;
ReleaseJoystick();
}

return dwRet;
}

/****************************************************************
引数: pDidInstance デバイスについての情報
pContext CBlInputのインスタンスへのポインタを渡してください
戻り値: DIENUM_CONTINUE 列挙続行
DIENUM_STOP 列挙終了
説明: ジョイスティックの列挙のためのコールバック関数

***************************************************************/

BOOL CBlInput::EnumJoysticksCallback( const DIDEVICEINSTANCE* pDidInstance, void* pContext )
{
BOOL bRet = DIENUM_STOP;
CBlInput *pBlInput = (CBlInput*)pContext;

assert(pBlInput);

HRESULT hr = pBlInput->m_pDInput->CreateDevice( pDidInstance->guidInstance, &(pBlInput->m_pDInputDevJoystick[pBlInput->m_nJoystickCount]), NULL );

if SUCCEEDED(hr){
++pBlInput->m_nJoystickCount;
bRet = (pBlInput->m_nJoystickCount == MAX_JOYSTICK) ? (DIENUM_STOP):(DIENUM_CONTINUE);
}

return bRet;
}

/****************************************************************
引数: DidOI デバイスのインスタンスについての情報
pContext CBlInputのインスタンスへのポインタを渡してください
戻り値: DIENUM_CONTINUE 設定続行
DIENUM_STOP 設定終了
説明: ジョイスティックの軸設定とオートセンター設定のためのコールバック関数

***************************************************************/

BOOL CBlInput::EnumAxesCallback( const DIDEVICEOBJECTINSTANCE* pDidOI, void *pContext )
{
BOOL bRet = DIENUM_STOP;

// 軸の範囲設定
DIPROPRANGE diprg;
ZeroMemory( &diprg, sizeof( diprg ) );
diprg.diph.dwSize = sizeof( diprg );
diprg.diph.dwHeaderSize = sizeof( diprg.diph );
diprg.diph.dwObj = pDidOI->dwType;
diprg.diph.dwHow = DIPH_BYID;
diprg.lMin = LOWER_JOYSTICK_AXIS;
diprg.lMax = UPEER_JOYSTICK_AXIS;

LPDIRECTINPUTDEVICE8 pDevJoystick = (LPDIRECTINPUTDEVICE8)pContext;

if SUCCEEDED( pDevJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ){
bRet = DIENUM_CONTINUE;
}
return bRet;
}
/****************************************************************
引数: なし
戻り値: なし
説明: マウスデバイスを解放する

***************************************************************/

void CBlInput::ReleaseMouse( void )
{
// マウスデバイス解放
if( m_pDInputDevMouse != NULL ){
m_pDInputDevMouse->Unacquire(); // 入力制御停止
m_pDInputDevMouse->Release();
m_pDInputDevMouse = NULL;
}

ZeroMemory( m_lMouseAxis, sizeof(m_lMouseAxis) );
ZeroMemory( m_btMouseButton, sizeof(m_btMouseButton) );
}

/****************************************************************
引数: なし
戻り値: なし
説明: キーボードデバイスを解放する

***************************************************************/

void CBlInput::ReleaseKeyboard( void )
{
// キーボードデバイス解放
if( m_pDInputDevKeyboard != NULL ){
m_pDInputDevKeyboard->Unacquire(); // 入力制御停止
m_pDInputDevKeyboard->Release();
m_pDInputDevKeyboard = NULL;
}

ZeroMemory( m_btKeyData, sizeof(m_btKeyData) );
}

/****************************************************************
引数: なし
戻り値: なし
説明: ジョイスティックデバイスを解放する

***************************************************************/

void CBlInput::ReleaseJoystick( void )
{
// ジョイスティックデバイス解放
for( int i = 0; i < MAX_JOYSTICK; ++i ){
if( m_pDInputDevJoystick[i] != NULL ){
m_pDInputDevJoystick[i]->Release();
m_pDInputDevJoystick[i] = NULL;
}
}

m_dwPolling = 0;

ZeroMemory( m_dwJoystickButton, sizeof(m_dwJoystickButton) );
ZeroMemory( m_lJoystickAxis, sizeof(m_lJoystickAxis) );
ZeroMemory( m_dwJoystickPOV, sizeof(m_dwJoystickPOV) );

m_nJoystickCount = 0;
}

/****************************************************************
引数: なし
戻り値: マウスデータ更新成功 TRUE
マウスデバイスが作成されていない FALSE
説明: マウスデータを更新する

***************************************************************/

BOOL CBlInput::RefreshMouseData( void )
{
BOOL bRet = FALSE;

if( m_pDInputDevMouse != NULL ){
// マウスデータの履歴を一つ後ろにずらす
m_btMouseButton[1] = m_btMouseButton[0];
for( int i = 0; i < MAX_MOUSE_AXIS; ++i ){
m_lMouseAxis[1][i] = m_lMouseAxis[0][i];
}

// 履歴の一番新しい所をクリア
ZeroMemory( &m_btMouseButton[0], sizeof(BYTE) );
ZeroMemory( m_lMouseAxis[0], sizeof(long)*MAX_MOUSE_AXIS );

// マウスデータ取得
DIMOUSESTATE2 mouse;
HRESULT hr = m_pDInputDevMouse->GetDeviceState( sizeof(DIMOUSESTATE2), &mouse );
if SUCCEEDED( hr ){
m_lMouseAxis[0][BLINP_X] = mouse.lX;
m_lMouseAxis[0][BLINP_Y] = mouse.lY;
m_lMouseAxis[0][BLINP_Z] = mouse.lZ;

for( int j = 0; j < MAX_MOUSE_BUTTON; ++j ){
m_btMouseButton[0] += ((mouse.rgbButtons[j] & 0x80) == 0x80) ? ( 0x01 << j) : 0;
}
}
else{
m_pDInputDevMouse->Acquire(); //入力制御が停止しているので動かす
}

bRet = TRUE;
}

return bRet;
}

/****************************************************************
引数: なし
戻り値: キーボードデータ更新成功 TRUE
キーボードデバイスが作成されていない FALSE
説明: マウスデータを更新する

***************************************************************/

BOOL CBlInput::RefreshKeyboardData( void )
{
BOOL bRet = FALSE;

if( m_pDInputDevKeyboard != NULL ){
// キーボードデータの履歴を一つ後ろにずらす
for( int i = 0; i < MAX_KEY; ++i ){
m_btKeyData[1][i] = m_btKeyData[0][i];
}

// 履歴の一番新しい所をクリア
ZeroMemory( m_btKeyData[0] ,sizeof(BYTE)*MAX_KEY );

// キーボードデータ取得
BYTE btKeyData[MAX_KEY];
HRESULT hr = m_pDInputDevKeyboard->GetDeviceState( MAX_KEY, btKeyData );
if SUCCEEDED( hr ){
memcpy( m_btKeyData, btKeyData, 256 );
}
else{
m_pDInputDevKeyboard->Acquire(); //入力制御が停止しているかもしれないので動かす
}

bRet = TRUE;
}

return bRet;
}

/****************************************************************
引数: なし
戻り値: ジョイスティックデータ更新成功 TRUE
ジョイスティックデバイスが作成されていない FALSE
説明: ジョイスティックデータを更新する

***************************************************************/

BOOL CBlInput::RefreshJoystickData( void )
{
BOOL bRet = FALSE;

// ジョイスティックの履歴を一つ後ろにずらす
for( int i = 0; i < m_nJoystickCount; ++i ){
if( m_pDInputDevJoystick[i] != NULL ){
if( m_dwPolling & (0x00000001UL << 1) != 0 ){
m_pDInputDevJoystick[i]->Poll();
}
// ボタン
m_dwJoystickButton[1][i] = m_dwJoystickButton[0][i];
// 軸
for( int j = 0; j < MAX_JOYSTICK_AXIS; ++j ){
m_lJoystickAxis[1][j][i] = m_lJoystickAxis[0][j][i];
}
// POV
for( j = 0; j < MAX_POV; ++j ){
m_dwJoystickPOV[1][j][i] = m_dwJoystickPOV[0][j][i];
}
// 履歴の一番新しい所をクリア
ZeroMemory( &m_dwJoystickButton[0][i], sizeof(DWORD) );
ZeroMemory( m_lJoystickAxis[0][i], sizeof(long)*MAX_JOYSTICK_AXIS );
ZeroMemory( m_dwJoystickPOV[0][i], sizeof(DWORD)*MAX_POV );

// ジョイスティックデータ取得
DIJOYSTATE2 joystick;
HRESULT a = DIERR_INPUTLOST;
a = DIERR_INVALIDPARAM;
a = DIERR_NOTACQUIRED;
a = DIERR_NOTINITIALIZED;
a = E_PENDING;
HRESULT hr = m_pDInputDevJoystick[i]->GetDeviceState( sizeof(DIJOYSTATE2), &joystick );
if SUCCEEDED( hr ){
for( int k = 0; k < MAX_JOYSTICK_BUTTON; ++k ){
m_dwJoystickButton[0][i] += ((joystick.rgbButtons[k] & 0x80) == 0x80) ? (0x00000001 << k) : 0;
}
m_lJoystickAxis[0][BLINP_X_ABS][i] = joystick.lX;
m_lJoystickAxis[0][BLINP_Y_ABS][i] = joystick.lY;
m_lJoystickAxis[0][BLINP_Z_ABS][i] = joystick.lZ;
m_lJoystickAxis[0][BLINP_X_ROTATE][i] = joystick.lRx;
m_lJoystickAxis[0][BLINP_Y_ROTATE][i] = joystick.lRy;
m_lJoystickAxis[0][BLINP_Z_ROTATE][i] = joystick.lRz;
m_lJoystickAxis[0][BLINP_U][i] = joystick.rglSlider[0];
m_lJoystickAxis[0][BLINP_V][i] = joystick.rglSlider[1];
m_lJoystickAxis[0][BLINP_X_VELOCITY][i] = joystick.lVX;
m_lJoystickAxis[0][BLINP_Y_VELOCITY][i] = joystick.lVY;
m_lJoystickAxis[0][BLINP_Z_VELOCITY][i] = joystick.lVZ;
m_lJoystickAxis[0][BLINP_U_VELOCITY][i] = joystick.rglVSlider[0];
m_lJoystickAxis[0][BLINP_V_VELOCITY][i] = joystick.rglVSlider[1];
m_lJoystickAxis[0][BLINP_X_ACCELERATION][i] = joystick.lAX;
m_lJoystickAxis[0][BLINP_Y_ACCELERATION][i] = joystick.lAY;
m_lJoystickAxis[0][BLINP_Z_ACCELERATION][i] = joystick.lAZ;
m_lJoystickAxis[0][BLINP_U_ACCELERATION][i] = joystick.rglASlider[0];
m_lJoystickAxis[0][BLINP_V_ACCELERATION][i] = joystick.rglASlider[1];
m_lJoystickAxis[0][BLINP_X_VELOCITY_RAD][i] = joystick.lARx;
m_lJoystickAxis[0][BLINP_Y_VELOCITY_RAD][i] = joystick.lARy;
m_lJoystickAxis[0][BLINP_Z_VELOCITY_RAD][i] = joystick.lARz;
m_lJoystickAxis[0][BLINP_X_FORCE][i] = joystick.lFX;
m_lJoystickAxis[0][BLINP_Y_FORCE][i] = joystick.lFY;
m_lJoystickAxis[0][BLINP_Z_FORCE][i] = joystick.lFZ;
m_lJoystickAxis[0][BLINP_U_FORCE][i] = joystick.rglFSlider[0];
m_lJoystickAxis[0][BLINP_V_FORCE][i] = joystick.rglFSlider[1];
m_lJoystickAxis[0][BLINP_X_TORQUE][i] = joystick.lFRx;
m_lJoystickAxis[0][BLINP_Y_TORQUE][i] = joystick.lFRy;
m_lJoystickAxis[0][BLINP_Z_TORQUE][i] = joystick.lFRz;

for( k = 0; k < MAX_POV; ++k ){
m_dwJoystickPOV[0][k][i] = joystick.rgdwPOV[k];
}
}
else{
m_pDInputDevJoystick[i]->Acquire();
}
bRet = TRUE;
}
}

return bRet;
}

/****************************************************************
引数: nButtonID データを取得したいボタンの定数
BLINP_LBUTTON 左ボタン
BLINP_RBUTTON 右ボタン
BLINP_MBUTTON 中ボタン
戻り値: TRUE 押されていた
FALSE 押されていなかった nButtonIDが不正
説明: マウスボタンの押下状態を提供する

***************************************************************/

BOOL CBlInput::GetMouseButton( const int nButtonID )
{
BOOL bRet = FALSE;
if( (nButtonID >= 0) && (nButtonID < MAX_MOUSE_BUTTON) ){
if( (m_btMouseButton[0] & nButtonID) != 0 ){
bRet = TRUE;
}
}

return bRet;
}

/****************************************************************
引数: nButtonID データを取得したいボタンの定数
BLINP_LBUTTON 左ボタン
BLINP_RBUTTON 右ボタン
BLINP_MBUTTON 中ボタン
戻り値: BLINP_TRIGGER_DOWN DOWNトリガー(OFF→ON)
BLINP_TRIGGER_UP UPトリガー(ON→OFF)
0 トリガー検出なし nButtonIDが不正
説明: マウスボタンのトリガーを提供する

***************************************************************/

int CBlInput::GetMouseButtonTrigger( const int nButtonID )
{
int nRet = 0;

if( (nButtonID >= 0) && (nButtonID < MAX_MOUSE_BUTTON) ){
if( (m_btMouseButton[0] & nButtonID) == 0 ){
if( (m_btMouseButton[1] & nButtonID) != 0 ){
nRet = BLINP_TRIGGER_DOWN;
}
}
else{
if( (m_btMouseButton[1] & nButtonID) == 0 ){
nRet = BLINP_TRIGGER_UP;
}
}
}

return nRet;
}

/****************************************************************
引数: nDataID データを取得したい軸の定数
BLINP_X X軸
BLINP_Y Y軸
BLINP_Z Z軸
戻り値: 軸の動いた量
説明: マウスの軸データを提供する
注意: 引数のnAxisIDが存在しない場合、戻り値は0を返す

***************************************************************/

int CBlInput::GetMouseAxisData( const int nAxisID )
{
int nAxisLevel = 0;

if( (nAxisID >= 0) && (nAxisID < MAX_MOUSE_AXIS) ){
nAxisLevel = m_lMouseAxis[0][nAxisID];
}

return nAxisLevel;
}

/****************************************************************
引数: nKeyID データを取得したいキーの定数(DIK_〜)
戻り値: TRUE 押されていた
FALSE 押されていなかった
説明: キーボードのキーの押下状態を提供する

***************************************************************/

BOOL CBlInput::GetKey( const int nKeyID )
{
BOOL bRet = FALSE;

if( (nKeyID >= 0) && (nKeyID < MAX_KEY) ){
if( (m_btKeyData[0][nKeyID]&0x80) != 0 ){
bRet = TRUE;
}
}

return bRet;
}

/****************************************************************
引数: nKeyID データを取得したいキーの定数(DIK_〜)
戻り値: BLINP_TRIGGER_DOWN DOWNトリガー(OFF→ON)
BLINP_TRIGGER_UP UPトリガー(ON→OFF)
0 トリガー検出なし nKeyIDが不正
説明: キーボードのキーのトリガーを提供する

***************************************************************/

int CBlInput::GetKeyTrigger( const int nKeyID )
{
int nRet = 0;

if( (nKeyID >= 0) && (nKeyID < MAX_KEY ) ){
if( (m_btKeyData[0][nKeyID]&0x80) == 0 ){
if( (m_btKeyData[1][nKeyID]&0x80) != 0 ){
nRet = BLINP_TRIGGER_DOWN;
}
}
else{
if( (m_btKeyData[1][nKeyID]&0x80) == 0 ){
nRet = BLINP_TRIGGER_UP;
}
}
}

return nRet;
}

/****************************************************************
引数: dwButtonID データを取得したいボタンの定数
nPlayer プレイヤー
戻り値: TRUE 押されていた
FALSE 押されていなかった
説明: キーボードのキーのトリガーを提供する

***************************************************************/

BOOL CBlInput::GetJoystickButton( const DWORD dwButtonID, const int nPlayer )
{
BOOL bRet = FALSE;

if( (nPlayer >= 0) && (nPlayer < MAX_JOYSTICK) ){
if( (m_dwJoystickButton[0][nPlayer]&dwButtonID) != 0 ){
bRet = TRUE;
}
}

return bRet;
}

/****************************************************************
引数: dwButtonID データを取得したいボタンの定数
戻り値: BLINP_TRIGGER_DOWN DOWNトリガー(OFF→ON)
BLINP_TRIGGER_UP UPトリガー(ON→OFF)
0 トリガー検出なし nPlayerが不正
説明: ジョイスティックのボタンのトリガーを提供する

***************************************************************/

int CBlInput::GetJoystickButtonTrigger( const DWORD dwButtonID, const int nPlayer )
{
int nRet = 0;

if( (nPlayer >= 0) && (nPlayer < MAX_JOYSTICK) ){
if( (m_dwJoystickButton[0][nPlayer]&dwButtonID) == 0 ){
if( (m_dwJoystickButton[1][nPlayer]&dwButtonID) != 0 ){
nRet = BLINP_TRIGGER_DOWN;
}
}
else{
if( (m_dwJoystickButton[1][nPlayer]&dwButtonID) == 0 ){
nRet = BLINP_TRIGGER_UP;
}
}
}

return nRet;
}


/****************************************************************
引数: nAxisID データを取得したい軸の定数
nPlayer プレイヤー
戻り値: 軸の動いた量
説明: ジョイスティックの軸データを提供する
注意: 引数のnAxisIDが存在しない場合、戻り値は0を返す

***************************************************************/

int CBlInput::GetJoystickAxisData( const int nAxisID, const int nPlayer )
{
int nRet = 0;

if( (nAxisID >= 0) && (nAxisID < MAX_JOYSTICK_AXIS) &&
(nPlayer >= 0) && (nPlayer < MAX_JOYSTICK) ){
nRet = m_lJoystickAxis[0][nAxisID][nPlayer];
}

return nRet;
}

/****************************************************************
引数: nPOVID データを取得したいPOVの定数
nPlayer プレイヤー
戻り値: POV軸の動いた量
説明: ジョイスティックのPOV軸データを提供する
注意: 引数のnPOVIDが存在しない場合、戻り値は0を返す

***************************************************************/

int CBlInput::GetJoystickPOVData( const int nPOVID, const int nPlayer )
{
DWORD dwRet = 0;

if( (nPOVID >= 0) && (nPOVID < MAX_POV) &&
(nPlayer >= 0) && (nPlayer < MAX_JOYSTICK) ){
dwRet = m_dwJoystickPOV[0][nPOVID][nPlayer];
}

return dwRet;
}