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对象 
}