我先前提出了有关鼠标输入的问题,这有助于我理解鼠标事件起初的作用。我创建了一个处理各种输入的类,并足以说明我尝试使用布尔值纠正了一些错误,但无济于事。
即使鼠标滚轮或鼠标没有滚动或移动,鼠标滚轮和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;
};
然后使您的主类实现此接口,并使您的鼠标处理代码接收指向该接口的指针。