Emscripten 调用 SDL_Init 冻结浏览器文本输入
Posted
技术标签:
【中文标题】Emscripten 调用 SDL_Init 冻结浏览器文本输入【英文标题】:Emscripten call to SDL_Init freezes Browser Textinput 【发布时间】:2012-12-15 13:37:29 【问题描述】:我目前正在 mingw 下交叉编译 Sprite 引擎。 因此我有 2 个问题。
Emscripten 通过 WebGL 层模拟 SDL 的行为。 使用 emcc 编译时,我什至不必链接 SDL 库。
问题是:
如果我像这样初始化我的应用程序:
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 的情况下工作!):
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 正常工作的解决方法?
问题
在我的WIN32系统上编译的这行代码填满了屏幕蓝色
SDL_FillRect(screen,NULL, SDL_MapRGB(screen->format, 255, 0, 0));
用 Emscripten 编译的同一行将屏幕填充为红色。
有没有办法在 Emscripten 或 SDL 标头中切换 SDL 颜色?
【问题讨论】:
【参考方案1】:默认情况下,Emscripten 将所有用户事件捕获到页面。例如,这对于全屏游戏是有意义的。在您的用例中,您可能希望修改 Emscripten 的 SDL_Init 以不监听键事件,或更改其 receiveEvent 返回值。
【讨论】:
谢谢 Alon,是的,这种行为是在浏览器环境中设计的,这确实是有道理的。 事实上,其他人偶然发现了与颜色和交叉编译相同的问题:等于您在 SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE) 中设置的每像素字节数;您将在 emscripten 中获得浏览器的像素格式【参考方案2】:在您的本机代码中,在 SDL_CreateWindow 调用之前添加:
SDL_SetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT, "#canvas");
更多信息在这里:https://wiki.libsdl.org/SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT
【讨论】:
【参考方案3】:遇到了同样的问题。对我来说,这样做解决了它:
模块['doNotCaptureKeyboard'] = true;
【讨论】:
以上是关于Emscripten 调用 SDL_Init 冻结浏览器文本输入的主要内容,如果未能解决你的问题,请参考以下文章
如何表示来自 emscripten/webassembly 调用的 void* 返回
是否可以使用 Emscripten 从 JavaScript 调用 C++ 函数?
断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`