作者rurumi0318 (C萌的把拔)
看板GameDesign
標題[請益] C++/DirectX9.0 取滑鼠位移
時間Mon Nov 22 20:32:52 2010
各位好,小弟目前要做一個功能:
依照滑鼠位移去對camera 做一些動作,有點像一般MMO RPG 那樣
壓著右鍵移動滑鼠才能旋轉鏡頭,但滑鼠位置不會改變。
現在卡在取mouse delta 的時候碰到一些小問題
我知道Direct Input 可以直接拿到mouse dX 和dY
但之前看GameDev 有人討論說mouse/keyboard 盡量不要用Direct Input 所以就不考慮他
我的方法大致上是這樣:
在game loop 裡面
1. 先記錄原先的mouse point (prePoint)
2. 用GetCursor 得到新的滑鼠座標 (pos)
3. dX = pos.x - prePoint.x
4. dY = pos.y - prePoint.y
5. 用SetCursorPos 把滑鼠放回原本的位置 (prePoint)
問題是測試時,滑鼠會一直有閃爍的現象 (移動之後又被放回原本的地方)
我上網goo 了一下只有得到把滑鼠隱藏起來這個解法
不知道有沒有人有類似的經驗或方法可以分享? 謝謝
code 大致上長這樣:
MainWndProc
===========================
switch(msg) {
case WM_MOUSEMOVE:
return 0;
case WM_RBUTTONDOWN:
bLockPoint = true; // 壓下右鍵
return 0;
case WM_RBUTTONUP:
bLockPoint = false; // 放開右鍵
return 0;
...
}
Update DX and DY
===========================
POINT pos;
GetCursorPos(&pos); // get mouse point
ScreenToClient(gd3dApp->getMainWnd(), &pos); // 轉換至視窗座標
// mouse delta
DX = pos.x - mPrePoint.x;
DY = pos.y - mPrePoint.y;
if(!bLockPoint)
{
mPrePoint = pos; // 更新 mPrePoint
}
else
{
// lock mouse point
// 將滑鼠移回上個 loop 時的位置
pos = mPrePoint;
ClientToScreen(gd3dApp->getMainWnd(), &pos);
SetCursorPos(pos.x, pos.y);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.193.26.40
→ Killercat:其實setcursorpos不是很推...這會造成視窗化的時候的問 11/24 10:07
→ Killercat:題,另外游標會抖是一定的阿 XD 11/24 10:07
→ Killercat:而且你這種寫法感覺上會造成fps不同下滑鼠抖抖抖程度不 11/24 10:08
→ Killercat:同,低fps下會更明顯 :D 11/24 10:08
→ hirabbitt:隱藏真滑鼠...是要做假滑鼠的意思嗎0.0 11/24 11:56
→ hirabbitt:感覺是還不錯的方法啊0.0> 11/24 11:56
→ rurumi0318:如果想達成上面描述的效果, 還有甚麼比較建議的方法嗎? 11/24 22:04
→ Killercat:看你在windowed底下要怎麼處理 沒打算處理windowed的話 11/25 03:16
→ Killercat:其實怎樣都可以啦... 把真滑鼠藏起來 完全用dx/dy來操作 11/25 03:16
→ Killercat:ui面的滑鼠游標我們也玩過 =P 只是我不懂為啥不用 11/25 03:17
→ Killercat:DXInput? 他的確寫起來頗麻煩 可是也只要wrap一次就搞定 11/25 03:17
→ Killercat:啦 遠比用setCursorPos造成的往後ui層介接的麻煩小的多 11/25 03:17
→ Killercat:另外要假就假到底 setCursorPos永遠設成畫面中心更方便 11/25 03:19