【问题标题】:SDL mouse button not consistentSDL 鼠标按键不一致
【发布时间】:2012-10-17 19:11:06
【问题描述】:

我在使用 SDL 轮询鼠标事件时遇到了一个奇怪的小问题。

        if(event.type == SDL_MOUSEBUTTONDOWN) {
            printf("click %d\n", event.button.button);
        }
        else if(event.type == SDL_MOUSEMOTION) {
            printf("move %d\n", event.button.button);


        }

如果我在移动鼠标时单击并按住鼠标右键,我会得到:

click 3 // = SDL_BUTTON_RIGHT
move 4  // != SDL_BUTTON_RIGHT !
move 4
...

即SDL_MOUSEBUTTONDOWN 将 button.button 设置为 3 用于鼠标右键,而 SDL_MOUSEMOTION 将其设置为 4。

有人知道为什么会这样吗?

【问题讨论】:

    标签: c++ button mouse mouseevent sdl


    【解决方案1】:

    您应该将event.motion 用于SDL_MOUSEMOTION,而不是event.button。此外,event.motion.state 是位掩码,您应该使用event.motion.state & SDL_BUTTON(3) 查询它。

    【讨论】:

    • 这确实有效 - 尽管从一个简短的实验来看,event.button = event.motion.state 似乎一直都在。令人讨厌的是右键单击event.button.button := SDL_BUTTON_RIGHT (= 3) 和右键单击动作event.button.button := SDL_BUTTON(SDL_BUTTON_RIGHT) (= 4...),所以它不像我想要的那样干净。 (有点烦人,它并不总是一个或另一个......
    • 那是因为,通过运动,您可以拥有多个鼠标按钮(这是一种或掩码的状态)。使用按钮向下或向上事件,无法拥有多个按钮,因此它只返回按钮的“索引”而不是掩码。我不知道那时,但现在面具有自己的常数。 SDL_BUTTON_RMASK = SDL_BUTTON(SDL_BUTTON_RIGHT)
    【解决方案2】:

    event.button.button 用于单击事件而不是运动,我不明白这段代码的目的?

    【讨论】:

    • 我只是检查在运动过程中按下了哪个(如果有)按钮。我原以为 event.button.button 会保留此信息(它适用于鼠标左键 - event.button.button 在每个 if 子句中为 1)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2020-09-17
    相关资源
    最近更新 更多