SDL 鼠标滚轮和鼠标移动
SDL mousewheel and mousemotion
我之前提出了一个关于鼠标输入的问题,这有助于我了解鼠标事件首先起作用。我创建了一个处理各种输入的类,可以说有一些错误我尝试用布尔值纠正但无济于事。
鼠标滚轮和鼠标运动事件连续执行,即使鼠标滚轮或鼠标未滚动或移动也是如此。
我用这个简单的调用测试鼠标滚动:
bool isMouseWheelScrolled() const
{
return pMouseWheelScrolled;
}
然后我使用 switch 语句侦听鼠标事件:
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_MOUSEMOTION:
onMouseMove(event);
break;
case SDL_MOUSEWHEEL:
onMouseWheelScroll(event);
break;
default:
break;
}
}
void onMouseWheelScroll(SDL_Event &event)
{
switch(event.wheel.type)
{
case SDL_MOUSEWHEEL:
pMouseWheelScrolled = true;
pMouseWheel.x = event.wheel.x;
pMouseWheel.y = event.wheel.y;
break;
default:
break;
}
}
同样的事情也适用于鼠标移动,但是:
void onMouseMove(SDL_Event &event)
{
pMouseMoved = true;
pMousePosition.x = event.motion.x;
pMousePosition.y = event.motion.y;
}
布尔值确实有问题;测试了将它们设置为 true 的条件,但我不知道如何分析这些布尔值变为 false 的条件。我的解决方案是专注于侦听鼠标状态,但是我不知道该怎么做,教程不足以解释它们。文档也不是那么直观。我需要布尔值的原因是我可以测试鼠标是否已在类外移动或滚动。我已经可以测试按键和鼠标按钮按下;但是鼠标滚轮和鼠标移动是另一个问题;主要是因为我需要获得
event.motion.x;
event.motion.y;
event.wheel.x;
event.wheel.y;
为我的相机。而且我不准备将相机传到我的课堂上,因为这会破坏 OO。
TLDR; 鼠标滚轮和鼠标移动设置为 true,但是当鼠标滚轮不滚动或鼠标不移动时如何禁用它们?
我想你误解了鼠标事件的工作原理。鼠标移动时,您不会收到SDL_MOUSEMOTION
事件。相反,当鼠标移动时,您将获得一个SDL_MOUSEMOTION
事件。也就是说,事件表示单个时刻。
如果要在移动鼠标时执行某些操作,最好的选择是将其作为对鼠标事件的直接响应。如果这违背了你的OO设计,那么你的设计是错误的。
如果你坚持使用布尔值,那么你应该将布尔变量设置为false
,一旦你的消费者类认为它是true
,这样每个事件只处理一次。
无论如何,我的建议是使用某种界面,例如:
class IMouseListener
{
virtual OnMouseMove(int x, int y) =0;
virtual OnMouseWheel(int x, int y) =0;
};
然后使主类实现此接口,并使鼠标处理代码接收指向此类接口的指针。
相关文章:
- SendInput()鼠标移动计算
- Win32 发送输入鼠标移动滞后并冻结
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- 使用具有设置延迟C++的mouse_event平滑鼠标移动
- Qt将鼠标移动事件转移到新窗口
- Qt 如何使用鼠标移动事件移动视图
- 触发鼠标按下事件,但不触发鼠标移动事件
- 发送到另一个窗口的鼠标移动消息不执行任何操作
- 如何将双精度类型的鼠标移动 x 和 y 从主机传递到 Qemu 中的虚拟机
- GLFW 不会检测到 GLFW 窗口外的鼠标移动
- QT QTest::键单击或鼠标移动似乎不适用于 QMenu 在我的情况下
- MFC GUI 自定义控件:如何绘制光标更新以响应鼠标移动?
- 在Qt5的OpenGL绘图中通过鼠标移动计算对象旋转角度
- SDL2 中的 GLFW 风格的无限鼠标移动
- 如何使用SFML鼠标移动分别移动多个图像
- 当光标锁定在屏幕中时,如何获得鼠标移动
- 当鼠标移动时,如何从wm_mousemove中获得每个像素坐标
- 如何在使用鼠标移动时捕捉QWidget几何图形
- 在Qt中获取原始鼠标移动
- 在eventFilter()中未捕获Qt鼠标移动事件