为什么SDL2枚举具有较高的意外值?

时间:2018-01-16 23:07:26

标签: c sdl-2

我在调试SDL2程序时遇到了困难:当我打印SDL_EventTypeSDL_Keycode等枚举值时,显示的值非常高并且彼此不同。例如,事件类型SDL_KEYDOWN对应于768 - 枚举SDL_EventType中没有769个元素!

我做了一点测试,看看这个奇怪的行为是否是由于我的程序,但行为仍然存在:

#include <stdio.h>
#include "SDL.h"

int main(int argc, char *argv[])
{
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Event event;
  SDL_Window *wind = SDL_CreateWindow("ee", 700, 100, 300, 300, 0);
  while (SDL_PollEvent == 1)
    SDL_PollEvent(&event);
  while (1)
  {
    SDL_PollEvent(&event);
    if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)
      break;
    fprintf(stderr, "type = %d\n", event.type);
    event.type = 0;
    SDL_Delay(15);
  }
  printf("%d\n", SDL_GetTicks());
  SDL_Quit();
    return 0;
}

打印SDLK_DOWNSDL_MOUSEMOTION或此类关键字会输出与上一个程序相同的结果,这是一致的。但为什么这些值与枚举类型不一致?

2 个答案:

答案 0 :(得分:8)

如果你看/* Window events */ SDL_WINDOWEVENT = 0x200, /**< Window state change */ SDL_SYSWMEVENT, /**< System specific event */ /* Keyboard events */ SDL_KEYDOWN = 0x300, /**< Key pressed */ SDL_KEYUP, /**< Key released */ ,那么你会看到类似的内容:

hosted_checkout

所以他们只是定义了这样的传播价值。这背后的基本原理是允许添加新值而不会破坏向后兼容性,同时保持某些枚举值的分组。

答案 1 :(得分:0)

你似乎在滥用事件。在你的情况下:

if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)

但是,event基本上是一个巨大的联盟,而event.key中的字段仅在event.type是与关键相关的事件之一时才有效。

也许这就是你的问题?听起来你误解了SDL_PollEvent返回的内容。

编辑: 在我之前的人似乎更关注主题,但我的观点仍然存在。令人钦佩的是,并不完全是你所要求的,但你可能仍会留意这一点。