|
发表于 2009-11-6 19:10:00
|
显示全部楼层
Re: 3D游戏如何接受鼠标消息?
bool CGameEngine_Input::CreateDirectInput(HINSTANCE hInst)
{
if(FAILED(DirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&g_pIDirectInput,NULL)))
{
MessageBox(NULL,"建立DirectInput8接口对象失败","警告",MB_OK | MB_ICONINFORMATION);
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_NONEXCLUSIVE | DISCL_FOREGROUND)))
{
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 = MOUSE_NUM;
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;
ZeroMemory(m_MouseDate,sizeof(DIDEVICEOBJECTDATA)*MOUSE_NUM);
int i;
for(i=0; i<MOUSE_NUM; i++)
{
if(m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseDate,&dwReadNum,0) == DIERR_INPUTLOST)
{
m_pMouseDevice->Acquire();
if(FAILED(m_pMouseDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&m_MouseDate,&dwReadNum,0)))
{
return false;
}
}
if(m_MouseDate.dwOfs == DIMOFS_X)
{
m_lMouseMoveX += m_MouseDate.dwData;
}
if(m_MouseDate.dwOfs == DIMOFS_Y)
{
m_lMouseMoveY += m_MouseDate.dwData;
}
}
return true;
}
bool CGameEngine_Input: ButtonDown()
{
for(int i=0; i<MOUSE_NUM; i++)
{
if((m_MouseDate.dwOfs == DIMOFS_BUTTON0) && (m_MouseDate.dwData & 0x80))
{
return true;
}
}
return false;
}
bool CGameEngine_Input::RButtonDown()
{
for(int i=0; i<MOUSE_NUM; i++)
{
if((m_MouseDate.dwOfs == DIMOFS_BUTTON1) && (m_MouseDate.dwData & 0x80))
{
return true;
}
}
return false;
}
bool CGameEngine_Input::MButtonDown()
{
for(int i=0; i<MOUSE_NUM; i++)
{
if((m_MouseDate.dwOfs == DIMOFS_BUTTON2) && (m_MouseDate.dwData & 0x80))
{
return true;
}
}
return false;
} |
|