SDL 鼠标滚轮和鼠标移动

SDL mousewheel and mousemotion

本文关键字:鼠标 移动 SDL      更新时间:2023-10-16

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

鼠标滚轮和鼠标运动事件连续执行,即使鼠标

滚轮或鼠标未滚动或移动也是如此。

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

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

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