?? input.h
字號:
//======================================================================
/**
* @file Input.h
*
* 項目描述: DirectInput鍵盤演示
*
* 文件描述: 輸入系統類CInputSystem
* 其中,類CKeyboard、CMouse、CJoystick分別用來處理鍵盤、鼠標
* 和游戲手柄,CInputSystem是輸入設備的管理類。
* 適用平臺: Windows98/2000/NT/XP
*
* 作者: WWBOSS
* 電子郵件: wwboss123@gmail.com
* 創建日期: 2007-07-24
* 修改日期: 2007-07-24
*/
//======================================================================
#ifndef __INPUT_H__
#define __INPUT_H__
#include "stdafx.h"
#include "Vector.h"
#define IS_USEKEYBOARD 1
#define IS_USEMOUSE 2
#define IS_USEJOYSTICK 4
/** 鼠標緩沖區大小 */
#define DINPUT_BUFFERSIZE 16
/** 鍵盤類 */
class CKeyboard
{
public:
/** 構造函數和析構函數 */
CKeyboard(LPDIRECTINPUT8 pDI, HWND hwnd);
~CKeyboard();
/** 判斷某個鍵是否被按下 */
bool KeyDown(char key);
/** 判斷某個鍵是否被釋放 */
bool KeyUp(char key);
/** 對鍵盤數據清零 */
void Clear();
/** 更新鍵盤數據 */
bool Update();
/** 取鍵盤數據 */
bool Acquire();
/** 停止取數據 */
bool Unacquire();
private:
/** 鍵盤設備 */
LPDIRECTINPUTDEVICE8 m_pDIDev;
/** 鍵盤數據區 */
char m_keys[256];
};
/** 鼠標類 */
class CMouse
{
public:
/** 構造函數和析構函數 */
CMouse(LPDIRECTINPUT8 pDI,HWND hwnd,bool isExclusive);
~CMouse();
/** 鼠標左鍵是否按下 */
bool IsLButtonPressed();
/** 鼠標右鍵是否按下 */
bool IsRButtonPressed();
/** 鼠標中鍵是否按下 */
bool IsMButtonPressed();
/** 獲得光標位置 */
Point2 GetMousePos();
/** 更新鼠標參數 */
bool Update();
/** 取鼠標數據 */
bool Acquire();
/** 停止取數據 */
bool Unacquire();
/** 窗口寬 */
int m_iWidth;
/** 窗口高 */
int m_iHeight;
private:
/** 鼠標設備 */
LPDIRECTINPUTDEVICE8 m_pDIDev;
/** 緩沖區數據數組 */
DIDEVICEOBJECTDATA m_diData[DINPUT_BUFFERSIZE];
/** 光標位置 */
Point2 m_iMousePos;
};
/** 游戲手柄 */
class CJoystick
{
public:
CJoystick(LPDIRECTINPUT8 pDI,HWND hwnd, HINSTANCE appInstance);
~CJoystick();
/** 更新手柄參數 */
bool Update();
/** 取手柄數據 */
bool Acquire();
/** 判斷手柄按鍵 */
bool IsButtonPressed(int iButton);
/** 設置游戲桿范圍 */
void SetMin(int min);
void SetMax(int max);
/** 設置游戲桿死區范圍 */
void SetDeadZone(int deadzone);
/** 停止取手柄數據 */
bool Unacquire();
private:
/** 枚舉設備回調函數 */
bool CALLBACK EnumJSCallback(LPCDIDEVICEINSTANCE pDIDeviceInstance, LPVOID pvRef);
private:
LPDIRECTINPUT8 m_pDI;
/** 手柄設備 */
LPDIRECTINPUTDEVICE8 m_pDIDev;
/** 手柄狀態數據 */
DIJOYSTATE2 m_diJoyState2;
/** 游戲桿軸范圍 */
int m_iMin;
int m_iMax;
/** 游戲桿死區范圍 */
int m_iDeadZone;
};
/** 輸入系統類 */
class CInputSystem
{
public:
/** 構造函數和析構函數 */
CInputSystem() { m_pInput = this; }
~CInputSystem() { ShutDown(); }
/** 初始化輸入設備 */
bool Init(HWND hwnd,HINSTANCE appInstance,
bool isExclusive,DWORD flags=0);
/** 釋放輸入設備資源 */
bool ShutDown();
/** 取輸入設備的數據 */
void AcquireAll();
/** 停止取輸入設備的數據 */
void UnacquireAll();
/** 更新輸入設備的參數 */
void Update();
/** 獲得光標的3D坐標 */
Vector3 GetMousePosition();
/** 獲得鍵盤 */
CKeyboard* GetKeyboard(){ return m_pKeyboard; }
/** 獲得鼠標 */
CMouse* GetMouse() { return m_pMouse; }
/** 獲得游戲桿 */
CJoystick* GetJoystick() { return m_pJoystick; }
/** 得到當前的窗口句柄 */
static HWND GetSysHWnd() { return m_hWnd; }
/** 得到當前的輸入設備 */
static CInputSystem* GetSysInput(){ return m_pInput; }
private:
/** 輸入系統 */
static CInputSystem* m_pInput;
/** 窗口句柄 */
static HWND m_hWnd;
/** 鍵盤 */
CKeyboard* m_pKeyboard;
/** 鼠標 */
CMouse* m_pMouse;
/** 游戲桿 */
CJoystick* m_pJoystick;
/** 輸入設備 */
LPDIRECTINPUT8 m_pDI;
};
//////////////////////////////////////////////////////////////////////////
/** CKeybord類inline操作和實現 */
/** key鍵是否按下 */
inline bool CKeyboard::KeyDown(char key)
{
return (m_keys[key] & 0x80) ? true : false;
}
/** key鍵是否按下 */
inline bool CKeyboard::KeyUp(char key)
{
return (m_keys[key] & 0x80) ? false : true;
}
/** 對鍵盤數據清零 */
inline void CKeyboard::Clear()
{
ZeroMemory(m_keys,256*sizeof(char));
}
/** 取鍵盤數據 */
inline bool CKeyboard::Acquire()
{
Clear();
return (!FAILED(m_pDIDev->Acquire()));
}
/** 停止取數據 */
inline bool CKeyboard::Unacquire()
{
Clear();
return (!FAILED(m_pDIDev->Unacquire()));
}
//////////////////////////////////////////////////////////////////
/** CMoust類inline操作和實現 */
/** 獲得光標位置 */
inline Point2 CMouse::GetMousePos()
{
return m_iMousePos;
}
/** 取鼠標數據 */
inline bool CMouse::Acquire()
{
return (!FAILED(m_pDIDev->Acquire()));
}
/** 停止取數據 */
inline bool CMouse::Unacquire()
{
return (!FAILED(m_pDIDev->Unacquire()));
}
//////////////////////////////////////////////////////////////////
/** CJoystick類inline操作和實現 */
/** 取手柄數據 */
inline bool CJoystick::Acquire()
{
return (!FAILED(m_pDIDev->Acquire()));
}
/** 停止取數據 */
inline bool CJoystick::Unacquire()
{
return (!FAILED(m_pDIDev->Unacquire()));
}
/** 判斷手柄按鍵 */
inline bool CJoystick::IsButtonPressed(int iButton)
{
if(m_diJoyState2.rgbButtons[iButton] & 0x80)
return true;
else
return false;
}
/** 設置函數 */
inline void CJoystick::SetMin(int min)
{
m_iMin = min;
}
inline void CJoystick::SetMax(int max)
{
m_iMax = max;
}
inline void CJoystick::SetDeadZone(int deadzone)
{
m_iDeadZone = deadzone;
}
/////////////////////////////////////////////////////////////
/** CInputSystem類的inline操作 */
/** 取輸入設備的數據 */
inline void CInputSystem::AcquireAll()
{
if (m_pKeyboard) m_pKeyboard->Acquire();
if (m_pMouse) m_pMouse->Acquire();
if(m_pJoystick) m_pJoystick->Acquire();
}
/** 停止取數據 */
inline void CInputSystem::UnacquireAll()
{
if (m_pKeyboard) m_pKeyboard->Unacquire();
if (m_pMouse) m_pMouse->Unacquire();
if(m_pJoystick) m_pJoystick->Unacquire();
}
#endif //__INPUT_H__
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -