SDL鼠标滚轮和鼠标运动

时间:2014-12-20 19:42:39

标签: c++ sdl

我之前提出了一个关于鼠标输入的问题,这有助于我了解鼠标事件的起步。我创建了一个处理各种输入的类,并且足以说明我尝试用布尔值修正了一些错误但无济于事。

即使鼠标滚轮或鼠标没有滚动​​或移动,鼠标滚轮和鼠标移动事件也会持续执行。

我通过这个简单的调用测试鼠标滚动:

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,但如何在鼠标滚轮不滚动或鼠标移动时禁用它们?

1 个答案:

答案 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;
};

然后让你的主类实现这个接口,并使你的鼠标处理代码接收到这种接口的指针。