我刚刚在我正在研究的项目中实现了sdl2 canvas的大小调整。阅读html5.h的emscripten文档,有一个函数可以在窗口调整大小事件上设置回调]
设置回调函数
EMSCRIPTEN_RESULT isSetCallback =
emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, mImpl->state, false, captureResizeEvent);
if (isSetCallback != EMSCRIPTEN_RESULT_SUCCESS)
{
throw std::string("Unable to set resize callback with EMSCRIPTEN_RESULT code %d\n", isSetCallback);
}
回调函数
EM_BOOL captureResizeEvent(int eventType, const EmscriptenUiEvent *e, void *rawState)
{
int newWidth = (int) e->windowInnerWidth;
int newHeight = (int) e->windowInnerHeight * hconstants::MAX_DIM_RATIO;
emscripten_set_canvas_element_size("canvas", newWidth, newHeight);
return 0;
}
使用此代码,画布可以根据需要正确调整大小-将其宽度设置为window.innerWidth,并将高度设置为常数* window.innerHeight。但是,画布的原点似乎不停留在左上角。
我使用以下代码在原点附近绘制一个正方形,宽度和高度为5像素。最初可以使用,但在垂直调整画布大小后,原点似乎会垂直移动。
SDL_Rect shape;
shape.x = 5;
shape.y = 5;
shape.h = 5;
shape.w = 5;
SDL_RenderDrawRect(mImpl->renderer, &shape);
调整大小之前,可以按预期在左上角附近看到黑色正方形。但是在调整的大小后,原点似乎从左上方向下漂移。我另外在整个画布上绘制了一个黑色正方形,这就是第二幅图像中出现黑线的原因(同样,原点似乎从左上角移开了。)
我已经使用元素检查器来验证画布在物理上是否仍位于左上角,并且在调整大小后画布实际上并未向下移动。
有人知道如何解决此问题吗?
编辑:我刚刚尝试删除SDL_Renderer并从窗口创建一个新的,但仍然不能解决问题。
好,所以我有一个可行的解决方案,但我仍然愿意听到任何更好的解决方案。
我最终只是删除了SDL_Renderer和SDL_Window对象,并在回调函数中重新创建了它们。我意识到这是非常低效的,但是我无法获得其他可行的解决方案,因此现在必须这样做。