首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一段时间内测试“SDL_PollEvent”的正确方法

在一段时间内测试“SDL_PollEvent”的正确方法
EN

Stack Overflow用户
提问于 2015-04-17 18:31:45
回答 3查看 8K关注 0票数 2

如手册所述,函数SDL_PollEvent“如果有挂起的事件返回1,如果没有可用的事件返回0”,这就是为什么我们使用测试SDL_PollEvent(&e)!=0 ( eSDL_Event)的原因。

但是,如何使用这个测试:!SDL_PollEvent(&e)呢?它应该能用,但很明显它会引起一些问题。

这里有一个代码示例:

代码语言:javascript
运行
复制
    #include <SDL2/SDL.h>
    #include <stdio.h>

    int main(int argc, char* args[]){
      SDL_Init(SDL_INIT_VIDEO);
      SDL_Window* window =   SDL_CreateWindow("Hello",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 100, 100,  SDL_WINDOW_SHOWN);
      SDL_Event e;
      int quit=0;
      while(!quit){
          //Here the test
          while (!SDL_PollEvent(&e)){
             if (e.type==SDL_QUIT)
                quit=1;
             else if ( e.type == SDL_KEYDOWN )
                printf( "Hello\n" );
          }
      }
      SDL_DestroyWindow(window);
      SDL_Quit();
      return 0;
   }

这段代码应该做的是打开一个新窗口,每次按下键时在控制台中打印"Hello“。这段代码可以很好地测试SDL_PollEvent(&e)!=0,但是当我使用测试!SDL_PollEvent(&e)时,它不会读取SDL_KEYDOWN事件(但是它确实在!SDL_PollEvent(&e)中输入并没有任何问题地处理SDL_QUIT事件)。

为什么会有这种行为?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-17 18:43:38

代码语言:javascript
运行
复制
while (!SDL_PollEvent(&e))

需要:

代码语言:javascript
运行
复制
while (SDL_PollEvent(&e))

如果应该与SDL_PollEvent(&e) != 0相同

因为!SDL_PollEvent(&e)与调用while(0)相同

票数 7
EN

Stack Overflow用户

发布于 2015-04-17 18:43:48

(1 != 0)是真的,但(!1)是假的。

无论如何,您可能应该使用SDL_WaitEvent

票数 2
EN

Stack Overflow用户

发布于 2021-05-16 06:55:49

增编

人们可能会认为这样做更清楚,因为这样可以确保用户的输入得到响应。然而,这是一个操作系统依赖的,可能是疯狂的CPU占用,并将最大化您的CPU这个线程(在Windows上)。所以你可能认为你可以在那里等待1秒,但是你的窗口会变得完全没有响应或者充其量是非常滞后的.如果你可以忍受一点CPU开销而什么也不做,那么你可以折衷使用20-100毫秒的延迟。

代码语言:javascript
运行
复制
...
    // Set the event handler...
    ...
    bool isRunning = true;
    while (isRunning) {
        // Do the main thing here...
        ...
        while(SDL_PollEvent(&windowEvent)) {
            switch (windowEvent.type) {
                case SDL_QUIT:              isRunning = false;
                case SDL_KEYDOWN:           isRunning = false;
                case SDL_MOUSEBUTTONDOWN:   isRunning = false;
                break;
            }
            SDL_Delay(100); // Wrong!
        }
    }
    // End the program

所以很明显,这也不是正确的方法。我们需要使用其他机制。看一看SDL回购,我们发现了一个关于公开问题的长期但非常相关的讨论:

修复问题

确保将延迟放在外部循环中,在SDL_PollEvent()之前。

代码语言:javascript
运行
复制
    // main loop
    ...
        while(SDL_PollEvent(&windowEvent)) {
            switch (windowEvent.type) {
                case SDL_QUIT:              isRunning = false;
                case SDL_KEYDOWN:           isRunning = false;
                case SDL_MOUSEBUTTONDOWN:   isRunning = false;
                break;
            }
        }
        SDL_Delay(100); // Right!
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29706885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档