SDL_MOUSEBUTTONUP 甚至在释放鼠标按钮之前发生?
SDL_MOUSEBUTTONUP occurring even before releasing mouse button?
我正在尝试使用 C++ 中的 SDL 和 ffmpeg 制作视频播放器。我创建了两个单独的线程,一个在 SDL window 上呈现视频,另一个处理 window 事件。当用户点击并释放视频时,我希望它切换 playback/pause。但是,它触发了多次,甚至在我释放鼠标之前就发生了事件,这导致了不可预测的行为。
我的代码:
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 released\n");
}
break;
}
}
当我单击 window 并按住时,我预计它不会打印 Mouse released
直到我松开按钮。但是,它会在我按住鼠标按钮的整个过程中打印 Mouse released
。我不知道这是否与我在笔记本电脑上使用触摸板有关。
编辑:我的答案是错误的,检查 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 released\n");
}
}
}
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
SDL_PollEvent 有一个 return 值,你忽略了。
[It] returns 1 if there are any pending events, or 0 if there are none available.
鉴于您的代码逻辑,只要没有未决事件,您就会一遍又一遍地处理前一个事件,直到新事件到达。这导致观察到的行为。
最简单的解决方法是将整个事件处理包装在 if (SDL_PollEvent(&event)) { /* Event handling */ }
条件中。
我正在尝试使用 C++ 中的 SDL 和 ffmpeg 制作视频播放器。我创建了两个单独的线程,一个在 SDL window 上呈现视频,另一个处理 window 事件。当用户点击并释放视频时,我希望它切换 playback/pause。但是,它触发了多次,甚至在我释放鼠标之前就发生了事件,这导致了不可预测的行为。
我的代码:
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 released\n");
}
break;
}
}
当我单击 window 并按住时,我预计它不会打印 Mouse released
直到我松开按钮。但是,它会在我按住鼠标按钮的整个过程中打印 Mouse released
。我不知道这是否与我在笔记本电脑上使用触摸板有关。
编辑:我的答案是错误的,检查 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 released\n");
}
}
}
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
SDL_PollEvent 有一个 return 值,你忽略了。
[It] returns 1 if there are any pending events, or 0 if there are none available.
鉴于您的代码逻辑,只要没有未决事件,您就会一遍又一遍地处理前一个事件,直到新事件到达。这导致观察到的行为。
最简单的解决方法是将整个事件处理包装在 if (SDL_PollEvent(&event)) { /* Event handling */ }
条件中。