我之前提出了一个关于鼠标输入的问题,这有助于我了解鼠标事件的起步。我创建了一个处理各种输入的类,并且足以说明我尝试用布尔值修正了一些错误但无济于事。
即使鼠标滚轮或鼠标没有滚动或移动,鼠标滚轮和鼠标移动事件也会持续执行。
我通过这个简单的调用测试鼠标滚动:
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;
}
布鲁尔确实存在问题;将它们设置为真的条件进行了测试,但我不知道如何分析这些布尔变为假的条件。我的解决方案是专注于监听鼠标状态,但是我不知道如何做到这一点并且教程不足以解释它们。文档也不直观。我需要布尔的原因是我可以测试鼠标是否已移动或滚动到课外。我已经可以测试按键和鼠标按键;鼠标滚轮和鼠标移动是另一个问题;主要是因为我需要获得
event.motion.x;
event.motion.y;
event.wheel.x;
event.wheel.y;
我的相机。而且我不准备将相机传递到我的班级,因为它打破了OO。
tldr;鼠标滚轮和鼠标移动设置为true,但如何在鼠标滚轮不滚动或鼠标移动时禁用它们?
答案 0 :(得分:1)
我认为您误解了鼠标事件的工作原理。鼠标移动时,您不会收到SDL_MOUSEMOTION
事件。相反,当移动鼠标时,您会收到SDL_MOUSEMOTION
事件。也就是说,事件代表了一个瞬间。
如果要在移动鼠标时执行某些操作,最佳选择是将其作为对鼠标事件的直接响应。如果这违背了您的OO设计,那么您的设计是错误的。
如果你坚持使用布尔值,那么你应该在消费者类将其视为false
时将布尔变量设置为true
,以便每个事件只处理一次。
无论如何,我的建议是使用某种界面,例如:
class IMouseListener
{
virtual OnMouseMOve(int x, int y) =0;
virtual OnMouseWheel(int x, int y) =0;
};
然后让你的主类实现这个接口,并使你的鼠标处理代码接收到这种接口的指针。