SDL - 鼠标输入
SDL - Mouse input
我已经通读了有关鼠标事件的文档,并且还阅读了有关鼠标输入处理的教程。虽然,这个问题仍然存在:
我有一个相机和一个 opengl 上下文,我只想在鼠标移动并单击鼠标左键时旋转相机。所以,我自然而然地写了这段代码:
void processEvents()
{
float deltaX = 0;
float deltaY = 0;
while (SDL_PollEvent(&pEvent) != 0)
{
if (pEvent.type == SDL_QUIT)
pApp_isRunning = false;
if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_LEFT)
{
deltaX += pEvent.motion.x;
deltaY += pEvent.motion.y;
pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);
cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
}
if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_RIGHT)
{
deltaX += pEvent.motion.x;
deltaY += pEvent.motion.y;
pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);
cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
}
}
}
鼠标左键似乎正在响应该事件,因为它会更新运动坐标。但是,如果我使用完全相同的代码,但只是使用SDL_BUTTON_RIGHT,则什么都不会发生!就好像 SDL 需要另一种方法来理解鼠标右键。我曾使用过 GLFW、SFML、GLUT、Qt,对于 SDL 来说,在鼠标右键事件中没有一致性是令人眼花缭乱的 imo。我在这里做错了什么?有没有按照我描述的方式处理鼠标输入的正确方法?如:
如果单击鼠标左键并且鼠标已移动:旋转相机。如果单击鼠标右键并且鼠标已移动:旋转相机。我一定在这里遗漏了一些东西,或者可能是 SDL2 的错误。
这里有一个常见的错误。 SDL_Event是一个并集,因此如果您已检查类型是否为SDL_MOUSEMOTION,则不应使用 event.button 字段。 换句话说,您正在调用未定义的行为,SDL 和鼠标右键不是问题。
相反,请使用 motion.state 字段:
if(pEvent.type == SDL_MOUSEMOTION && pEvent.motion.state & SDL_BUTTON_LMASK)
...
尝试替换:
if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_RIGHT)
{
deltaX += pEvent.motion.x;
deltaY += pEvent.motion.y;
pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);
cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
}
由:
if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON(SDL_BUTTON_RIGHT))
{
deltaX += pEvent.motion.x;
deltaY += pEvent.motion.y;
pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);
cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
}
我记得在我玩 SDL 的那一天就有过这种"错误"(另外,如果您想要 SDL 的 c++ 包装器,请检查 SFML(
相关文章:
- Win32 发送输入鼠标移动滞后并冻结
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- opengl中鼠标输入背后的数学和偏航/俯仰值
- SDL C++鼠标输入处理切换效果
- GetAsyncKeyState 未检测到鼠标输入
- 鼠标输入和键输入有什么区别(在前台获取窗口)
- 跟踪鼠标输入事件
- 鼠标跟踪的原始输入始终返回 0 作为增量值
- 如何使用Win32 API阻止来自透明窗口的鼠标输入?
- 发送输入鼠标时间
- 防止触摸输入移动的鼠标光标在窗口上
- QT4.8嵌入.使用QCursor :: SetPos()调整鼠标输入会导致一个抽搐的光标
- 将鼠标和键盘输入传递到背景窗口而不会失去焦点
- 使用鼠标作为输入设备 c++
- C++ WinAPI - 草率的鼠标输入
- 打开GL/Glut绘制的线未从鼠标输入显示
- Windows C - 需要想法 - 在同一应用/窗口中将鼠标输入和原始输入组合在一起
- 如何防止鼠标将输入发送到DirectInput游戏
- C++编译器,形状,如何在鼠标输入上更改颜色
- 在LINUX上获取设备输入(鼠标、键盘..)