Emscripten SDL2-调整画布大小时,画布的原点似乎移动了

问题描述 投票:0回答:1

我刚刚在我正在研究的项目中实现了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);

调整enter image description here大小之前,可以按预期在左上角附近看到黑色正方形。但是在调整enter image description here的大小后,原点似乎从左上方向下漂移。我另外在整个画布上绘制了一个黑色正方形,这就是第二幅图像中出现黑线的原因(同样,原点似乎从左上角移开了。)

我已经使用元素检查器来验证画布在物理上是否仍位于左上角,并且在调整大小后画布实际上并未向下移动。

有人知道如何解决此问题吗?

编辑:我刚刚尝试删除SDL_Renderer并从窗口创建一个新的,但仍然不能解决问题。

javascript c++ canvas sdl-2 emscripten
1个回答
0
投票

好,所以我有一个可行的解决方案,但我仍然愿意听到任何更好的解决方案。

我最终只是删除了SDL_Renderer和SDL_Window对象,并在回调函数中重新创建了它们。我意识到这是非常低效的,但是我无法获得其他可行的解决方案,因此现在必须这样做。

© www.soinside.com 2019 - 2024. All rights reserved.