为什么 SDL2 枚举具有很高的意外值?
Why do SDL2 enumerations have high unexpected values?
我在调试 SDL2 程序时遇到了困难:当我打印 SDL_EventType
或 SDL_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_DOWN
、SDL_MOUSEMOTION
之类的关键字输出的结果和前面的程序一样,是连贯的。但是为什么这些值与枚举类型不一致?
如果您查看 SDL_events.h
,您会看到如下内容:
/* Window events */
SDL_WINDOWEVENT = 0x200, /**< Window state change */
SDL_SYSWMEVENT, /**< System specific event */
/* Keyboard events */
SDL_KEYDOWN = 0x300, /**< Key pressed */
SDL_KEYUP, /**< Key released */
所以它们只是用这样的传播值定义的。这背后的基本原理是允许在不破坏向后兼容性的情况下添加新值,同时保持某些枚举器值分组。
您似乎在滥用事件。你的情况:
if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)
但是,event
基本上是一个巨大的联合,event.key
中的字段仅在 event.type
是与键相关的事件之一时才有效。
也许这就是您的问题?对我来说,这听起来像是你误解了 SDL_PollEvent
returns.
编辑:
我面前的人似乎更切题,但我的观点仍然成立。不可否认,这并不完全是您要问的问题,但您可能仍要注意这一点。
我在调试 SDL2 程序时遇到了困难:当我打印 SDL_EventType
或 SDL_Keycode
等枚举值时,显示的值非常高并且彼此不同。例如,事件类型 SDL_KEYDOWN
对应于 768 - 而枚举 SDL_EventType
!
我做了一些测试,看看这种奇怪的行为是否是我的程序造成的,但这种行为仍然存在:
#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_DOWN
、SDL_MOUSEMOTION
之类的关键字输出的结果和前面的程序一样,是连贯的。但是为什么这些值与枚举类型不一致?
如果您查看 SDL_events.h
,您会看到如下内容:
/* Window events */
SDL_WINDOWEVENT = 0x200, /**< Window state change */
SDL_SYSWMEVENT, /**< System specific event */
/* Keyboard events */
SDL_KEYDOWN = 0x300, /**< Key pressed */
SDL_KEYUP, /**< Key released */
所以它们只是用这样的传播值定义的。这背后的基本原理是允许在不破坏向后兼容性的情况下添加新值,同时保持某些枚举器值分组。
您似乎在滥用事件。你的情况:
if (event.type == SDL_QUIT || event.key.keysym.sym == SDLK_ESCAPE)
但是,event
基本上是一个巨大的联合,event.key
中的字段仅在 event.type
是与键相关的事件之一时才有效。
也许这就是您的问题?对我来说,这听起来像是你误解了 SDL_PollEvent
returns.
编辑: 我面前的人似乎更切题,但我的观点仍然成立。不可否认,这并不完全是您要问的问题,但您可能仍要注意这一点。