作者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
1F:→ Killercat:其实setcursorpos不是很推...这会造成视窗化的时候的问 11/24 10:07
2F:→ Killercat:题,另外游标会抖是一定的阿 XD 11/24 10:07
3F:→ Killercat:而且你这种写法感觉上会造成fps不同下滑鼠抖抖抖程度不 11/24 10:08
4F:→ Killercat:同,低fps下会更明显 :D 11/24 10:08
5F:→ hirabbitt:隐藏真滑鼠...是要做假滑鼠的意思吗0.0 11/24 11:56
6F:→ hirabbitt:感觉是还不错的方法啊0.0> 11/24 11:56
7F:→ rurumi0318:如果想达成上面描述的效果, 还有甚麽比较建议的方法吗? 11/24 22:04
8F:→ Killercat:看你在windowed底下要怎麽处理 没打算处理windowed的话 11/25 03:16
9F:→ Killercat:其实怎样都可以啦... 把真滑鼠藏起来 完全用dx/dy来操作 11/25 03:16
10F:→ Killercat:ui面的滑鼠游标我们也玩过 =P 只是我不懂为啥不用 11/25 03:17
11F:→ Killercat:DXInput? 他的确写起来颇麻烦 可是也只要wrap一次就搞定 11/25 03:17
12F:→ Killercat:啦 远比用setCursorPos造成的往後ui层介接的麻烦小的多 11/25 03:17
13F:→ Killercat:另外要假就假到底 setCursorPos永远设成画面中心更方便 11/25 03:19