【问题标题】:SDL2 event callback without polling没有轮询的 SDL2 事件回调
【发布时间】:2018-10-07 09:19:54
【问题描述】:

是否可以在不轮询新事件的情况下使用 SDL_EventWatch/Filter

#include <SDL2/SDL.h>
#include <iostream>

 int SDLCALL watch(void *userdata, SDL_Event* event) {
        std::cout << event->type << "\n";
    return 1; // or 0
}

int main( ){
    SDL_Window *window {SDL_CreateWindow("Window", 100, 100, 400, 400, 0)};
    SDL_Renderer* renderer {SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED)};

    SDL_SetEventFilter(watch, NULL);

    function.Call("main"); // non-C++ function with endless loop

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

"main" 中已经有一个无限循环,它控制着大部分应用程序。然后,我会根据给 watch(..) 的 SDL_Event 调用适当的 Lua 函数。

此代码不对任何事件作出反应。

【问题讨论】:

  • 嗨,你能告诉我们你的非 C++ 主函数吗?我认为您仍然需要轮询或打开或让 SDL 打开一个可能处理您的事件的线程。如果您正在运行循环,则必须以某种方式让 SDL 有机会处理这些事件。另请查看此 wiki 条目:wiki.libsdl.org/SDL_SetEventFilter
  • 我认为这对你没有多大帮助。 main 函数做了很多逻辑,你可以用 Lua 或 Python 等语言快速编写脚本。当然,它还执行一些 SDL 渲染 C 调用。您的评论似乎导致对我的问题的否定回答。我有点期待。 :)
  • 以可移植的方式进行会有问题。为什么这是个问题?无论如何你必须有渲染器刷新点,为什么事件队列的考虑不同?
  • 你为什么暗示我认为这是一个问题?这不是问题,它只是一种不同的方式。不过还是谢谢。

标签: c++ event-handling sdl-2


【解决方案1】:

正如 Gerhard Stein 博士在 cmets 中所说:

如果您正在运行循环,则必须以某种方式让 SDL 有机会处理事件。

所以答案很简单

【讨论】:

  • 我觉得这个答案令人困惑。评论指出您需要允许 SDL 处理真实的事件,但您的最后一句话听起来像是您不同意。我认为这值得更多阐述。
  • 我不同意我尝试尝试“不同”的东西是一个问题。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多