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));
ちなみに、これら2つの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;
}
}
}