Posted on 2010-12-15 15:29
點點滴滴 閱讀(337)
評論(0) 編輯 收藏 引用 所屬分類:
08 游戲SDK
1.當窗口最小化后,單擊只有按下無彈起事件
void MouseDeviceOgreOIS::poll()
{
if (mMouse)
{
mMouse->capture();
OIS::MouseState& state = mMouse->getMouseState();
//設置鼠標無法改變OIS底層GetDeviceData的數據,造成bug,需要解決。
POINT point;
GetCursorPos(&point);
ScreenToClient((HWND)mWhd, &point);
Vector3 pos(point.x * 1.0f, point.y * 1.0f, 0.0f);
mPosition.x = state.X.abs * 1.0f;
mPosition.y = state.Y.abs * 1.0f;
mPosition.z = state.Z.abs * 1.0f;
if ((mPosition.x != pos.x) || (mPosition.y != pos.y))
{
mPosition.x = pos.x;
mPosition.y = pos.y;
}
if (!mActualClip.contains(mPosition))//修改OISBug,當在最小化后,單擊只有按下無彈起事件。
{
if(mButtons[MBT_LEFT])
mButtons[MBT_LEFT] = state.buttonDown(OIS::MB_Left);
else
state.buttons &= ~(1 << OIS::MB_Left); //turn the bit flag off
if(mButtons[MBT_RIGHT])
mButtons[MBT_RIGHT] = state.buttonDown(OIS::MB_Right);
else
state.buttons &= ~(1 << OIS::MB_Right); //turn the bit flag off
if(mButtons[MBT_MIDDLE])
mButtons[MBT_MIDDLE] = state.buttonDown(OIS::MB_Middle);
else
state.buttons &= ~(1 << OIS::MB_Middle); //turn the bit flag off
return;
}
mButtons[MBT_LEFT] = state.buttonDown(OIS::MB_Left);
mButtons[MBT_RIGHT] = state.buttonDown(OIS::MB_Right);
mButtons[MBT_MIDDLE] = state.buttonDown(OIS::MB_Middle);
}
}
2.使用SetCursorPos后,無移動鼠標,OIS無法取得鼠標移動信息
void Win32Mouse::capture()
{
//Clear old relative values
mState.X.rel = mState.Y.rel = mState.Z.rel = 0;
DIDEVICEOBJECTDATA diBuff[MOUSE_DX_BUFFERSIZE];
DWORD entries = MOUSE_DX_BUFFERSIZE;
HRESULT hr = mMouse->GetDeviceData( sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0 );
if( hr != DI_OK )
{
hr = mMouse->Acquire();
while( hr == DIERR_INPUTLOST )
hr = mMouse->Acquire();
hr = mMouse->GetDeviceData( sizeof(DIDEVICEOBJECTDATA), diBuff, &entries, 0 );
//Perhaps the user just tabbed away, and coop settings
//are nonexclusive..so just ignore
if( FAILED(hr) )
return;
}
bool axesMoved = false;
//Accumulate all axis movements for one axesMove message..
//Buttons are fired off as they are found
for(unsigned int i = 0; i < entries; ++i )
{
switch( diBuff[i].dwOfs )
{
case DIMOFS_BUTTON0:
if(!_doMouseClick(0, diBuff[i])) return;
break;
case DIMOFS_BUTTON1:
if(!_doMouseClick(1, diBuff[i])) return;
break;
case DIMOFS_BUTTON2:
if(!_doMouseClick(2, diBuff[i])) return;
break;
case DIMOFS_BUTTON3:
if(!_doMouseClick(3, diBuff[i])) return;
break;
case DIMOFS_BUTTON4:
if(!_doMouseClick(4, diBuff[i])) return;
break;
case DIMOFS_BUTTON5:
if(!_doMouseClick(5, diBuff[i])) return;
break;
case DIMOFS_BUTTON6:
if(!_doMouseClick(6, diBuff[i])) return;
break;
case DIMOFS_BUTTON7:
if(!_doMouseClick(7, diBuff[i])) return;
break;
case DIMOFS_X:
mState.X.rel += diBuff[i].dwData;
axesMoved = true;
break;
case DIMOFS_Y:
mState.Y.rel += diBuff[i].dwData;
axesMoved = true;
break;
case DIMOFS_Z:
mState.Z.rel += diBuff[i].dwData;
axesMoved = true;
break;
default: break;
} //end switch
}//end for
if( axesMoved )// 有偏移信息才會設置鼠標位置
{
if( coopSetting & DISCL_NONEXCLUSIVE )
{
//DirectInput provides us with meaningless values, so correct that
POINT point;
GetCursorPos(&point);
ScreenToClient(mHwnd, &point);
mState.X.abs = point.x;
mState.Y.abs = point.y;
}
else
{
mState.X.abs += mState.X.rel;
mState.Y.abs += mState.Y.rel;
}
mState.Z.abs += mState.Z.rel;
//Clip values to window
if( mState.X.abs < 0 )
mState.X.abs = 0;
else if( mState.X.abs > mState.width )
mState.X.abs = mState.width;
if( mState.Y.abs < 0 )
mState.Y.abs = 0;
else if( mState.Y.abs > mState.height )
mState.Y.abs = mState.height;
//Do the move
if( mListener && mBuffered )
mListener->mouseMoved( MouseEvent( this, mState ) );
}
}