SDL_MOUSEBUTTONUP甚至在释放鼠标按钮之前发生



我正在尝试在C++中使用 SDL 和 ffmpeg 制作视频播放器。我创建了两个单独的线程,一个在 SDL 窗口上呈现视频,另一个处理窗口事件。当用户点击并释放视频时,我希望它切换播放/暂停。但是,它会多次触发,甚至在我释放鼠标之前就发生了该事件,从而导致不可预测的行为。

我的代码:

SDL_Event event;
    while (1)
    {
        SDL_PollEvent(&event);
        switch (event.type)
        {
            case SDL_QUIT:
                SDL_DestroyWindow(screen);
                SDL_Quit();
                break;
            case SDL_MOUSEBUTTONUP:
                if (event.button.state == SDL_RELEASED)
                {
                    printf("Mouse releasedn");
                }
                break;
        }
    }

当我单击窗口并按住时,我希望它不会打印Mouse released,直到我松开按钮。但是,它在我按住鼠标按钮的整个过程中打印Mouse released。我不知道这是否与我在笔记本电脑上使用触摸板有关。

SDL_PollEvent有一个返回值,你忽略了。

[它] 如果有任何挂起的事件,则返回 1,如果没有可用事件,则返回 0。

给定代码逻辑,只要没有挂起事件,就会一遍又一遍地处理上一个事件,直到新事件到达。这会导致观察到的行为。

最简单的解决方法是将整个事件处理包装在if (SDL_PollEvent(&event)) { /* Event handling */ }条件中。

编辑:我的答案是错误的,请检查IInspectable的答案。

您的错误是您没有检查 pollEvent 给出的所有待处理事件,而只检查一个。试试这段代码,告诉我你得到了多少个按钮。

#include <SDL2/SDL.h>
#include <iostream>

int main(int argc, char *argv[]) {
    if(SDL_Init(SDL_INIT_VIDEO) != 0) {
        throw std::runtime_error("SDL failed to initialize.n");
    }
    SDL_Window *window = SDL_CreateWindow("App", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, NULL);
    bool done = false;
    while(!done) {
        SDL_Event event;
        while(SDL_PollEvent(&event)) {
            if(event.type == SDL_QUIT) {
                done = true;
            }
            if (event.type == SDL_MOUSEBUTTONUP) {
                if (event.button.state == SDL_RELEASED) {
                    printf("Mouse releasedn");
                }
            }
        }
    }
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

最新更新