【问题标题】:IF in an SDL_PollEvent does not work as expectedSDL_PollEvent 中的 IF 未按预期工作
【发布时间】:2021-11-20 01:05:30
【问题描述】:

编辑:我通过将SDLKEYUP 更改为SDLKEYDOWN 解决了这个问题。谁能解释一下原因?

我正在尝试使用 SDL2 在 C 中按“p”时编写暂停按钮。

下面的代码在按下 'p' 时停止精灵移动,并在按下 'r' 时恢复它:

SDL_PollEvent(&event);
switch(event.type)
{
    case SDL_QUIT:
        continuer = 0;
        break;
    case SDL_KEYUP:
        switch(event.key.keysym.sym)
        {
            case SDLK_p:
                    pause=1;
                    break;
            case SDLK_r:
                    pause=0;
                    break;
        }
}

但是下面的代码在按下“p”时不会暂停,int pause=0 在开始时和主循环之外声明,并且除了下面的 SDLK_p 之外没有修改。好像if(pause==0) 不起作用:

SDL_PollEvent(&event);
switch(event.type)
{
    case SDL_QUIT:
        continuer = 0;
        break;
    case SDL_KEYUP:
        switch(event.key.keysym.sym)
        {
            case SDLK_p:
                if(pause==0)
                {
                    pause=1;
                    break;
                } else pause=0;
                break;
            case SDLK_ESCAPE:
                continuer=0;
                break;
        }
}

【问题讨论】:

  • 在代码的 if 和 else 部分添加一些日志,看看它是否被命中以及何时被命中。
  • 类型?您在SDLK_r 中说第二个代码,但它是SDLK_p
  • 是的,我的错,SDLK_p
  • @RetiredNinja 你的意思是通过记录添加断点吗?
  • @RetiredNinja 或者你的意思是像 stderr 和 GetError() 这样的东西?老实说,我是一个初学者,以前从未使用过,你介意指出我记录 if 和 else 语句的好方向吗?

标签: c if-statement sdl-2


【解决方案1】:

您的问题是您没有检查 SDL_PollEvent 的返回值,结果处理过时的数据。如果没有事件从偶数队列返回,则返回 0,这意味着您应该处理事件结构中的内容,因为 SDL_PollEvent 没有填充它。这里发生的事情是您处理事件结构的旧内容(可能是从之前的民意调查中填充的,没有足够的代码来确定)。

如果你把它改成KEYDOWN,你仍然会遇到多次处理keydown的问题,但是当你释放键时,你的最后一个事件数据是KEYUP,所以你的keydown反应代码不再被触发。

此外,单个图形帧中很容易包含多个事件,因此需要循环处理事件:

while(SDL_PollEvent(&event)) {
    // process event contents
}

【讨论】:

  • 感谢您的解释!我现在明白了。
猜你喜欢
  • 2015-04-21
  • 2020-11-28
  • 2020-03-11
  • 1970-01-01
  • 2018-02-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多