获取鼠标的原始移动值,应用于类似cs中鼠标移动,控制相机的转向问题!
最近在模仿cs的部分功能,做一个小射击游戏。用w-a-s-d控制相机在平面上移动,用鼠标控制转向时,遇到一个问题。获取鼠标位置时,使用的是GetCursorPos方法,这个方面返回鼠标的当前屏幕坐标,这样就存在一个问题:假设鼠标当前坐标p0(x,y) =(300, 300)移动鼠标向右,此时p1(500, 400),这样有个
delta(500-300, 400 - 300) = (200, 100),此时,鼠标向右移动,对应相机在3D坐标中的方向,应该是以y轴为中心,顺时针旋转,但此时能转动的最大角度就是 ScreenWidth - p0.x,如果想一直不停地转圈圈,则不能实现。
解决方法有两个:
1、当检测到鼠标位置超出范围时,将其重新设置成屏幕中心(类似一个相对小的值),这样当下次鼠标继续向一个方面时,能够重新利用delta值转动相机
/*if (curPos.x || curPos.x >= VAL_WINDOW_WIDTH)
{
curPos.x = VAL_WINDOW_WIDTH/2;
}
if (curPos.y || curPos.y >= VAL_WINDOW_HEIGHT)
{
curPos.y = VAL_WINDOW_HEIGHT/2;
}*/
SetCursorPos(curPos.x, curPos.y);
2、利用下面的方法,获取鼠标的移动的相对位置,比如说鼠标当前在位置p0(x0,y0),当我们移动鼠标时,鼠标值会有个相对前一个点位置的变化值
pDelta(xdelta, ydelta),这样就可以直接获取这个值来转动相机,而不需要利用方法1来计算相对位置。获取方法如下,转自msdn
Introduction
A standard computer mouse returns data at 400 dots per inch (DPI), whereas a high-definition mouse generates data at 800 DPI or greater. This makes input from a high-definition mouse much more precise than that from a standard mouse. However, high-definition data cannot be obtained through the standard WM_MOUSEMOVE messages. In general, games will benefit from high-definition mouse devices but games that obtain mouse data using just WM_MOUSEMOVE won't be able to access the full, un-filtered resolution of the mouse.
A number of companies ar