gpt4 book ai didi

c++ - 创建我自己的 SDL 事件结构是否安全?

转载 作者:行者123 更新时间:2023-11-28 00:57:04 25 4
gpt4 key购买 nike

我想使用 SDL 用户事件来跟踪我的应用程序中的自定义事件。我的问题是 SDL_UserEvent 结构只提供了一个 int 和两个 v​​oid 指针。

typedef struct{  Uint8 type;  int code;  void *data1;  void *data2;} SDL_UserEvent;

我希望有一个具有以下结构的事件:

typedef struct{  Uint8 type; /* Set to SDL_USEREVENT + MAP */  int   code; /* Set to MAP_COLLISION */  Uint8 tile_x;  Uint8 tile_y;  Uint8 tile_type;} UserEvent_MapCollision;

然后,只要我想处理 MAP 事件,我就可以重新解释_cast 结构,如果我不这样做,则无需额外处理就丢弃消息。使用此技术可以简化我的事件处理程序(无需 malloc 和释放此结构并将其附加到事件)。

只要我检查(在构建时?)sizeof(UserEvent_MapCollision) <= sizeof(SDL_Event) ,并且 SDL 事件队列不会以任何方式修改推送的事件,这行得通吗?

最佳答案

是的,它会起作用,记住 SDL_Event结构本身很大 union .你是对的,如果你不确定你的结构是否适合 SDL_Event您可以添加此编译时断言:sizeof(UserEvent_MapCollision) <= sizeof(SDL_Event) .

/* Push event */
SDL_Event e;
UserEvent_MapCollision* p = static_cast<UserEvent_MapCollision*>(&e);;

e.type = SDL_USEREVENT + MAP;
e.code = MAP_COLLISION;
p.tile_x = 10;
p.tile_y = 20;
p.tile_type = 7;

/* Receive event */
SDL_Event e;
while (SDL_PollEvents(&e)) {
if (e.type == SDL_USEREVENT + MAP) {
if (e.user.code == MAP_COLLISION) {
UserEvent_MapCollision *p = static_cast<UserEvent_MapCollision>(&e)
HandleMapCollision(p);
}
}
}

要在编译时检查断言,您可以使用 SDL 宏 SDL_COMPILE_TIME_ASSERT , 它在 SDL_stdinc.h 中定义:

SDL_COMPILE_TIME_ASSERT(UserEvent_MapCollision, sizeof(UserEvent_MapCollision) <= sizeof(SDL_Event));

作为旁注,那两个 void*指针旨在引用另一个结构。

typedef struct {
Uint8 tile_x;
Uint8 tile_y;
Uint8 tile_type;
} MyCustomEventStruct;

/* Create event */

SDL_UserEvent e;
MyCustomEventStruct *p;

p = new MyCustomEventStruct;
p->tile_x = 10;
p->tile_y = 20;
p->tile_type = 7;

e.type = SDL_USEREVENT + MAP;
e.code = MAP_COLLISION;
e.data1 = p;
e.data2 = 0;

SDL_PushEvent(&e);

/* Receive Event */

while (SDL_PollEvents(&e)) {
if (e.type == SDL_USEREVENT + MAP) {
if (e.user.code == MAP_COLLISION) {
MyCustomEventStruct* p = static_cast<MyCustomEventStruct*>(e.user.data1);
HandleMapCollision(p);
delete p;
}
}
}

关于c++ - 创建我自己的 SDL 事件结构是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10499385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com