SDL_鼠标按钮在释放鼠标按钮之前是否会发生? 我试图用C++中的SDL和FFMPEG制作一个视频播放器。我创建了两个独立的线程,一个在SDL窗口上渲染视频,另一个处理窗口事件。当用户单击并释放视频时,我希望它切换播放/暂停。但是,它会多次触发,事件甚至在我释放鼠标之前发生,这会导致不可预测的行为
我的代码:SDL_鼠标按钮在释放鼠标按钮之前是否会发生? 我试图用C++中的SDL和FFMPEG制作一个视频播放器。我创建了两个独立的线程,一个在SDL窗口上渲染视频,另一个处理窗口事件。当用户单击并释放视频时,我希望它切换播放/暂停。但是,它会多次触发,事件甚至在我释放鼠标之前发生,这会导致不可预测的行为,c++,mouseevent,sdl-2,C++,Mouseevent,Sdl 2,我的代码: SDL_Event event; while (1) { SDL_PollEvent(&event); switch (event.type) { case SDL_QUIT: SDL_DestroyWindow(screen); SDL_Quit(); break;
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;
}
}
当我点击窗口并按住时,我希望在我松开按钮之前,它不会打印
鼠标释放的
。但是,它会在我按住鼠标按钮的整个过程中打印鼠标释放的。我不知道这是否与我在笔记本电脑上使用触摸板有关。编辑:我的答案是错误的,请检查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;
}
#包括
#包括
int main(int argc,char*argv[]){
如果(SDL_Init(SDL_Init_视频)!=0){
抛出std::runtime_错误(“SDL未能初始化。\n”);
}
SDL_Window*Window=SDL_CreateWindow(“应用程序”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,640480,空);
bool done=false;
而(!完成){
SDL_事件;
while(SDL_事件和事件)){
if(event.type==SDL\u QUIT){
完成=正确;
}
if(event.type==SDL_MOUSEBUTTONUP){
如果(event.button.state==SDL_已发布){
printf(“鼠标释放\n”);
}
}
}
}
SDL_窗口(窗口);
SDL_退出();
返回0;
}
有一个返回值,您将忽略它
[It]如果有任何未决事件,则返回1;如果没有可用事件,则返回0
给定您的代码逻辑,每当没有挂起事件时,您都会一遍又一遍地处理上一个事件,直到新事件到来。这导致观察到的行为
最简单的修复方法是将整个事件处理包装在一个if(SDL_polleevent(&event)){/*event handling*/}
条件中。请给出您的问题的最小示例。@Aram I添加了一个示例。SDL_polleevent
有一个返回值。这可能会证明非常有用。@IInspectable哇,那太尴尬了。。。这就是我没有彻底阅读文档的原因。它解决了我的问题,如果你把它变成一个答案,我会接受它。非常感谢。解释是错误的。OP肯定正在检索所有挂起的事件。真正的问题是,他们没有检查是否有任何新事件(通过检查返回值),从而反复处理同一事件,直到新事件出现。