Emscripten调用SDL_Init会冻结浏览器文本输入

时间:2012-12-15 13:37:30

标签: sdl emscripten

我目前正在mingw下交叉编译Sprite Engine。 因此,我有两个问题。

SDL的行为由Emscripten通过WebGL层进行模拟。 在使用emcc编译时,我甚至不必链接SDL库。

  1. 问题是:

    如果我将我的应用程序初始化为这样:

    if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) == -1)return -1;
    SDL_Surface *screen= SDL_SetVideoMode(640, 480,  24, SDL_SWSURFACE);
    SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 0, 0));
    SDL_Flip(screen);
    

    然后我无法将文本放入浏览器的文本字段中,但我得到的是SDL_Events。 所有其他浏览器输入(如复选框或选择框)都在工作。

    如果像这样初始化我的应用程序(Emscripten也可以在没有SDL_Init的情况下工作!):<​​/ p>

    SDL_Surface *screen= SDL_SetVideoMode(640, 480,  24, SDL_HWSURFACE);
    SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 0, 0));
    SDL_Flip(screen);
    

    然后我能够将tet放入浏览器文本字段,但我没有得到SDL_Events。

    是否有解决方法可以使浏览器文本输入字段和SDL_Events正常工作?

  2. 问题

    在我的WIN32系统上编译的这行代码填充了蓝屏

    SDL_FillRect(screen,NULL, SDL_MapRGB(screen->format, 255, 0, 0));
    

    使用Emscripten编译的同一行将屏幕填充为红色。

    有没有办法在Emscripten或SDL标题中切换SDL颜色?

3 个答案:

答案 0 :(得分:3)

默认情况下,Emscripten会捕获页面的所有用户事件。例如,这对于全屏游戏来说是有意义的。在您的用例中,您可能希望修改Emscripten的SDL_Init以不侦听键事件或更改其receiveEvent返回值。

答案 1 :(得分:0)

有同样的问题。对我来说,这样做是为了解决它:

Module ['doNotCaptureKeyboard'] = true;

答案 2 :(得分:0)

从您的本机代码中,将其添加到SDL_CreateWindow调用之前:

SDL_SetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT, "#canvas");

此处有更多信息:https://wiki.libsdl.org/SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT