如何在SDL中向事件循环发送应用程序定义的消息?



我刚刚开始学习SDL2,因为它真正承诺在c#中拥有可移植的UI。我是一个窗口,一个画布,一个事件循环的粉丝。使基本建模中的某些事情更简单。但这意味着现在我需要问一些非常基本的问题。

我有一个进入事件循环的前台线程。在某些时候,后台线程需要告诉前台线程,应用程序状态发生了变化,它需要重新绘制一些东西(或所有的东西,视情况而定)。SDL有应用程序事件,但我不知道如何发送它们。

void redraw() {
var surface = SDL_GetWindowSurface(window);
SDL_FillRect(surface, IntPtr.Zero, SDL_MapRGB(surface.GetPixelFormat(), 0x9F, 0x9F, 0xFF));
SDL_UpdateWindowSurface(window);
}
new Thread(() => {
Thread.Sleep(30000);
/* SEND EVENT HERE */
}).Start();
bool done = false;
while (!done && SDL_WaitEvent(out var ev) != 0) {
switch (ev.type) {
case SDL_USEREVENT:
redraw();
break;
case SDL_WINDOWEVENT:
switch (ev.window.windowEvent) {
case SDL_WINDOWEVENT_CLOSE:
SDL_DestroyWindow(window);
done = true;
break;
}
break;
}

但是我找不到如何从另一个线程发送用户事件。

不要告诉我使用SDL计时器。这是样板。真正的代码是另一回事

所以立即修复发送事件(BAD CODE ALERT):

new Thread(() => {
Thread.Sleep(30000);
SDL_Event sdlevent = new SDL_Event();
sdlevent.type = SDL_USEREVENT;
SDL_PushEvent(ref sdlevent);
}).Start();

但是这个代码在其他人注册事件的情况下是错误的。我们需要注册一个事件,获取ID,并使用它。

var myevent = (SDL_EventType)SDL_RegisterEvents(1);
new Thread(() => {
Thread.Sleep(30000);
SDL_Event sdlevent = new SDL_Event();
sdlevent.type = myevent;
SDL_PushEvent(ref sdlevent);
}).Start();

现在case行是

case var typemyevent when typemyevent == myevent:

我不确定是c#还是SDL更尴尬,但这就是它。

相关内容

最新更新