看板 GameDesign 關於我們 聯絡資訊
各位好,小弟目前要做一個功能: 依照滑鼠位移去對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