无法从窗口获取 SDL2 事件
cant get SDL2 event's from window
我试图在C 中学习SDL。我有简单的程序将显示图像。但是,当我尝试通过单击窗口上的关闭按钮关闭窗口时,什么也不会发生。
这是我的代码: -
#include <SDL2/SDL.h>
int main(int argc,char **argv)
{
static int k =0;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *w;
w = SDL_CreateWindow("SDL VS Works",300,300,400,500,SDL_WINDOW_OPENGL);
SDL_Renderer *render = SDL_CreateRenderer(w,-1,SDL_RENDERER_ACCELERATED);
SDL_Surface *tux = SDL_LoadBMP("res/tux.bmp");
SDL_Texture *texture = SDL_CreateTextureFromSurface(render,tux);
SDL_FreeSurface(tux);
SDL_ShowWindow(w);
SDL_Event event;
while(1)
{
k++;
printf("Running and loop %d'thn",k);
SDL_PollEvent(&event);
if(event.type == SDL_QUIT)
{
printf("closing n");
goto sos;
}
SDL_RenderCopy(render,texture,0,0);
SDL_RenderPresent(render);
SDL_Delay(1000);
}
sos:
SDL_DestroyWindow(w);
SDL_DestroyRenderer(render);
SDL_DestroyTexture(texture);
SDL_Quit();
}
我在Arch Linux上使用G 7.3。
SDL内部使用事件队列。当发生任何发生任何事件时,就像鼠标移动几个像素一样,它会添加到队列中。当您对事件进行轮询(使用SDL_PollEvent
(时,您只会获得最古老的事件。其他一切都停留在队列中。
由于您的代码每秒仅轮询一次,因此队列可能被鼠标的动作淹没,而SDL_QUIT
事件只是在排队等候,深入到队列。
您通常想做的是对循环中的事件进行民意调查。请注意,SDL_PollEvent
在没有待处理事件时返回0。
while (SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT)
{
//...
}
}
顺便说一句,循环应该看起来像这样:
SDL_Event SDLEvent;
while (SDL_PollEvent(&SDLEvent))
{
switch (SDLEvent.type)
{
case SDL_QUIT: break;
case SDL_WINDOWEVENT: break;
case SDL_MOUSEMOTION: break;
case SDL_MOUSEWHEEL: break;
}
}
是这样的开关语句还是像您这样的if语句并不重要。如果队列中仍然存在事件,则SDL_POLLEVENTS将返回1,否则为零。通过在段条件内调用SDL_POLLEVENTS(&amp; sdlevent(,它将在Next进入WALE BLOCK之前处理队列中的所有事件。
有趣的是,您的窗口不会关闭的问题似乎与其他问题有关,因为它对我有用。我已经提到了也许摆脱了SDL_DELAY系列,看看是否可以做任何事情;
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 如何创建事件驱动的 SDL2 应用程序
- 不带轮询的 SDL2 事件回调
- SDL2 无法捕获控制台键盘事件?
- SDL2 + Win32 API 菜单栏单击事件不起作用
- 在 Android 上触摸事件 SDL2
- 为什么 SDL2 提供的事件值不正确
- 无法从窗口获取 SDL2 事件
- SDL2未接收到窗口事件
- SDL2程序使用事件崩溃
- SDL2操纵杆事件未触发