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

即使鼠标滚轮或鼠标没有滚动​​或移动,鼠标滚轮和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;
};


然后使您的主类实现此接口,并使您的鼠标处理代码接收指向该接口的指针。

09-09 19:06
查看更多