我正在使用Direct3D游戏引擎,我以前的项目中设置了鼠标和键盘,但是最近遇到了问题:
问题是,我的引擎是用于射击/砍杀游戏的,因此它需要直接输入,这是在上一个项目中使用RAWMOUSE和WM_INPUT消息解析设置的。
case WM_INPUT:
if (wParam == RIM_INPUT)
{
dword dwSize = 48;
RAWINPUT raw;
if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &raw, &dwSize,
sizeof(RAWINPUTHEADER)) != dwSize)
OutputDebugString(TEXT("GetRawInputData does not return correct size !\n"));
if (raw.header.dwType == RIM_TYPEMOUSE)
{
this->mouse.TranslateMouseInput(raw.data.mouse);
}
break;
}
问题是,该代码仅返回鼠标的相对运动,在设置相机查找时很有用,但是当涉及到菜单或基本GUI(由鼠标(按钮等...)控制)时,情况会变糟: GUI和其他控件要求相对于客户端矩形计算光标位置。
我发现在WinAPI中最接近的答案是GetCursorPos()
与GetWindowRect()
组合,但是如果窗口具有标题栏,则它的相对偏移不计算在内,并且(0,0)坐标设置为标题栏顶部,但不在客户区域上。
如何解决此问题而又不会使鼠标相对移动?
-我应该尝试使用WM_INPUT解析WM_MOUSEMOVE消息吗?
我一直在寻找一种流行的游戏引擎输入解决方案,但没有找到任何特定的解决方案。
其他信息:
答案 0 :(得分:2)
当您需要绝对鼠标位置时,最好的选择是使用标准WM_MOUSE*
消息,并且仅将WM_INPUT
用于相对鼠标位置。通常,在启动UI或其他方面以进入/退出相对的“外观”模式时,您会进行模式转换。
WM_INPUT
在大多数情况下仅提供相关信息,并且如果您尝试自己模拟绝对值,则将丢失很多指针弹道,使它感觉真的很差。
请注意,如果您希望您的游戏支持通过远程桌面使用(通常用于测试),则需要处理来自绝对位置的相对输入,因为在虚拟桌面的情况下,您永远不会获得相对的输入,只有绝对的,来自
WM_INPUT
。由MOUSE_VIRTUAL_DESKTOP
表示。
您可能想看看Mouse中的DirectX Tool Kit类实现。