www.pudn.com > GameEngine.rar > GameEngine_Input.cpp, change:2005-08-19,size:8644b
#include "..\GameEngine_Common.h"
#include "GameEngine_Input.h"
CGameEngine_Input::CGameEngine_Input()
{
m_bUseJoystick=0; //默认不使用游戏杆
m_pKeyboardDevice=NULL;
m_lMouseMoveX=0;
m_lMouseMoveY=0;
}
bool CGameEngine_Input::CreateInput(HINSTANCE hInst,HWND hWnd,int iMin,int iMax,int iDeadZone,bool bUseJoystick){
CreateDirectInput(hInst);
CreateKeyboard(hWnd);
CreateMouse(hWnd);
if(bUseJoystick)
CreateJoystick(hWnd,iMin,iMax,iDeadZone);
return true;
}
bool CGameEngine_Input::CreateDirectInput(HINSTANCE hInst){
//创建IDirectInput接口对象
if(FAILED(DirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&g_pIDirectInput,NULL))){
MessageBox(NULL,"建立IDIRECTINPUT8接口对象失败.","警告",MB_OK|MB_ICONINFORMATION);
return false;
}
return true;
}
bool CGameEngine_Input::CreateKeyboard(HWND hWnd){
//创建键盘输入设备
if(FAILED(g_pIDirectInput->CreateDevice(GUID_SysKeyboard,&m_pKeyboardDevice,NULL))){
MessageBox(NULL,"建立键盘输入设备对象失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置键盘输入设备的数据格式
if(FAILED(m_pKeyboardDevice->SetDataFormat(&c_dfDIKeyboard))){
MessageBox(NULL,"设置键盘的数据读取数据格式失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置键盘输入设备的协调级别
if(FAILED(m_pKeyboardDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE))){
MessageBox(NULL,"设置键盘协调级别失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//获取键盘输入设备的访问权
if(FAILED(m_pKeyboardDevice->Acquire())){
MessageBox(NULL,"取得键盘设备的访问权失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//初始化键盘缓冲区
ZeroMemory(m_KeyBuffer,sizeof(char)*256);
return true;
}
//判断用户按键函数
bool CGameEngine_Input::ReadKeyboard(){ //key=DIK_RIGHT,DIK_LEFT,DIK_A,.....
if(DIERR_INPUTLOST==m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer)){
m_pKeyboardDevice->Acquire(); //重新获取键盘的使用权
if(FAILED(m_pKeyboardDevice->GetDeviceState(sizeof(m_KeyBuffer),(LPVOID)m_KeyBuffer))){
return false;
}
}
return true;
}
bool CGameEngine_Input::CreateMouse(HWND hWnd){
//创建鼠标输入设备
if(FAILED(g_pIDirectInput->CreateDevice(GUID_SysMouse,&m_pMouseDevice,NULL))){
MessageBox(NULL,"建立鼠标输入设备对象失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置鼠标设备的数据格式
if(FAILED(m_pMouseDevice->SetDataFormat(&c_dfDIMouse))){
MessageBox(NULL,"设置鼠标的数据读取格式失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置鼠标设备的协调级别
if(FAILED(m_pMouseDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE))){
MessageBox(NULL,"设置鼠标协调级别失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置鼠标设备的属性(使用缓冲区读数据)
DIPROPDWORD dipROPWORD;
dipROPWORD.diph.dwSize=sizeof(DIPROPDWORD);
dipROPWORD.diph.dwHeaderSize=sizeof(DIPROPHEADER);
dipROPWORD.diph.dwObj=0;
dipROPWORD.diph.dwHow=DIPH_DEVICE;
dipROPWORD.dwData=ITEMS_NUM; //#define ITEMS_NUM 10
if(FAILED(m_pMouseDevice->SetProperty(DIPROP_BUFFERSIZE,&dipROPWORD.diph))){
MessageBox(NULL,"设置鼠标设备属性失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//获取鼠标设备的访问权
if(FAILED(m_pMouseDevice->Acquire())){
MessageBox(NULL,"取得鼠标的访问权失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
return true;
}
//捕捉鼠标按键和移动数据
bool CGameEngine_Input::ReadMouse(){
DWORD dwReadNum=1;
int i;
//每次读取数据前,一定要使鼠标缓冲区清零
ZeroMemory(m_MouseData,sizeof(DIDEVICEOBJECTDATA)*ITEMS_NUM);
//循环读取鼠标数据
for(i=0;i<ITEMS_NUM;i++){
if(DIERR_INPUTLOST==m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseData[i],&dwReadNum,0)){
m_pMouseDevice->Acquire();
if(FAILED(m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseData[i],&dwReadNum,0))){
return false;
}
}
if(m_MouseData[i].dwOfs==DIMOFS_X){
m_lMouseMoveX+=m_MouseData[i].dwData;
}
if(m_MouseData[i].dwOfs==DIMOFS_Y){
m_lMouseMoveY+=m_MouseData[i].dwData;
}
}
return true;
}
//判断鼠标左键按下
bool CGameEngine_Input::IsLButtonPressed(){
for(int i=0;i<ITEMS_NUM;i++){
if((m_MouseData[i].dwOfs==DIMOFS_BUTTON0) && (m_MouseData[i].dwData & 0x80)){
return true;
}
}
return false;
}
//判断鼠标右键按下
bool CGameEngine_Input::IsRButtonPressed(){
for(int i=0;i<ITEMS_NUM;i++){
if((m_MouseData[i].dwOfs==DIMOFS_BUTTON1) && (m_MouseData[i].dwData & 0x80)){
return true;
}
}
return false;
}
//判断鼠标滚轮按下
bool CGameEngine_Input::IsMButtonPressed(){
for(int i=0;i<ITEMS_NUM;i++){
if((m_MouseData[i].dwOfs==DIMOFS_BUTTON2) && (m_MouseData[i].dwData & 0x80)){
return true;
}
}
return false;
}
bool CGameEngine_Input::CreateJoystick(HWND hWnd,int iMin,int iMax,int iDeadZone){
//枚举已安装的所有游戏杆
if(FAILED(g_pIDirectInput->EnumDevices(DI8DEVCLASS_GAMECTRL,EnumJSCallback,&m_pJoystickDevice,DIEDFL_ATTACHEDONLY))){
MessageBox(NULL,"枚举游戏杆失败.","警告",MB_OK|MB_ICONINFORMATION);
return false;
}
if(m_pJoystickDevice==NULL){
MessageBox(NULL,"没有安装游戏杆.","警告",MB_OK|MB_ICONINFORMATION);
return false;
}
//设置DirectInput游戏杆设备的数据格式
if(FAILED(m_pJoystickDevice->SetDataFormat(&c_dfDIJoystick2))){
MessageBox(NULL,"设置游戏杆的数据读取数据格式失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置DirectInput游戏杆设备的协调级别
if(FAILED(m_pJoystickDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND|DISCL_EXCLUSIVE))){
MessageBox(NULL,"设置游戏杆协调级别失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置游戏杆的轴范围属性
DIPROPRANGE dipROPRANGE;
dipROPRANGE.diph.dwSize=sizeof(DIPROPRANGE);
dipROPRANGE.diph.dwHeaderSize=sizeof(DIPROPHEADER);
dipROPRANGE.diph.dwObj=0;
dipROPRANGE.diph.dwHow=DIPH_DEVICE;
dipROPRANGE.lMin=iMin;
dipROPRANGE.lMax=iMax;
if(FAILED(m_pJoystickDevice->SetProperty(DIPROP_RANGE,&dipROPRANGE.diph))){
MessageBox(NULL,"设置游戏杆轴范围属性失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//设置游戏杆的死区范围
DIPROPDWORD dipROPDWORD;
dipROPDWORD.diph.dwSize=sizeof(DIPROPDWORD);
dipROPDWORD.diph.dwHeaderSize=sizeof(DIPROPHEADER);
dipROPDWORD.diph.dwObj=0;
dipROPDWORD.diph.dwHow=DIPH_DEVICE;
dipROPDWORD.dwData=100*iDeadZone;
if(FAILED(m_pJoystickDevice->SetProperty(DIPROP_DEADZONE,&dipROPDWORD.diph))){
MessageBox(NULL,"设置游戏杆轴无效范围属性失败.","警告",MB_OK|MB_ICONINFORMATION);
InputRelease();
return false;
}
//初始化游戏杆缓冲区
ZeroMemory(&m_JoystickData,sizeof(DIJOYSTATE2));
return true;
}
//枚举游戏杆的回调函数
BOOL CALLBACK EnumJSCallback(LPCDIDEVICEINSTANCE pDIDeviceInstance,LPVOID pvRef){
LPDIRECTINPUTDEVICE8* ppDID=(LPDIRECTINPUTDEVICE8*)pvRef;
if(FAILED(g_pIDirectInput->CreateDevice(pDIDeviceInstance->guidInstance,ppDID,NULL)))
return DIENUM_CONTINUE;
else
return DIENUM_STOP;
}
bool CGameEngine_Input::ReadJoystick(){
//获取游戏杆的访问权
if(FAILED(m_pJoystickDevice->Acquire())){
return false;
}
//检测游戏杆
if(FAILED(m_pJoystickDevice->Poll())){
return false;
}
//读取游戏杆的输入
if(DIERR_INPUTLOST==m_pJoystickDevice->GetDeviceState(sizeof(DIJOYSTATE2),&m_JoystickData)){
m_pJoystickDevice->Acquire(); //重新获取游戏杆使用权
if(FAILED(m_pJoystickDevice->GetDeviceState(sizeof(DIJOYSTATE2),&m_JoystickData))){
return false;
}
}
return true;
}
CGameEngine_Input::~CGameEngine_Input()
{
InputRelease();
}
void CGameEngine_Input::InputRelease(){
if(m_pKeyboardDevice){
m_pKeyboardDevice->Unacquire(); //释放键盘的使用权
}
if(m_pMouseDevice){
m_pMouseDevice->Unacquire(); //释放鼠标的使用权
}
if((m_bUseJoystick==true) & (m_pJoystickDevice!=NULL)){
m_pJoystickDevice->Unacquire(); //释放游戏杆的使用权
}
SafeRelease(m_pKeyboardDevice); //释放键盘设备对象
SafeRelease(m_pMouseDevice); //释放鼠标设备对象
if((m_bUseJoystick==true) & (m_pJoystickDevice!=NULL)){
SafeRelease(m_pJoystickDevice); //释放游戏杆设备对象
}
SafeRelease(g_pIDirectInput); //释放DirectInput对象
}