【问题标题】:SDL2 not receiving window eventsSDL2 未接收到窗口事件
【发布时间】:2013-08-26 23:20:09
【问题描述】:

我已经在我的 Macbook 和 Xcode 上使用 SDL2 有一段时间了,我很高兴。最近我试图接收一个焦点丢失事件,但它不起作用。经过一番修补,我发现没有收到任何窗口事件,除了一个类型为 512 的窗口事件,它以随机间隔每秒显示 2-5 次。 WindowEventIDs 是一个枚举,而不是十六进制格式,所以它不应该是一些十六进制数字。我在 SDL2 框架中搜索了 512,但一无所获。其他事件,如 SDL_QUITSDL_KEYDOWN 工作得很好。有人知道怎么回事吗?

这是我的事件循环:

SDL_Event event;

bool running = false;
while(running) {
    while(SDL_PollEvent(&event)) {
        if(event.type == SDL_QUIT)
            running = false;

        else if(event.type == SDL_KEYDOWN) {
            cout << event.key.type << endl;
        }
        else if(event.type == SDL_WINDOWEVENT) {
            cout << event.window.type << endl;
        }
    }

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
}

【问题讨论】:

  • while(SDL_PollEvent(&amp;event)) {} 会消耗大量 CPU。这是一个非阻塞操作,当没有事件时会一直返回 false。
  • 当 SDL_PollEvent 第一次返回 false 时,while 循环将退出。

标签: c++ events sdl sdl-2


【解决方案1】:

您需要检查event.window.event 而不是event.window.type,因为类型更通用并且有一些其他用途(代码 512 与 SDL_WINDOW_INPUT_FOCUS 相关,并且在您将光标移入或移出窗口时触发)。所以你的代码可能是这样的:

while(SDL_PollEvent(&event)) {
    switch(event.type)
    {
    case SDL_WINDOWEVENT:
        switch(event.window.event)
        {
        case SDL_WINDOWEVENT_ENTER:
            cout << "entered" << endl;
            break;

        case SDL_WINDOWEVENT_LEAVE:
            cout << "left" << endl;
            break;
        }
        break;

    case SDL_KEYDOWN:
        cout << "key pressed: " << event.key.keysym.sym << endl;
        break;
    }
}

【讨论】:

  • 你是一个救生员。不敢相信在查看 SDL 网站上的示例代码时我没有注意到这一点。完美运行!
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
相关资源
最近更新 更多