Я только что реализовал изменение размера холста sdl2 в проекте, над которым я работаю. Считывая документацию emscripten для html5 .h, есть функция для установки обратного вызова для события изменения размера окна
Настройка функции обратного вызова
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);
Перед изменением размера
черный квадрат можно увидеть в верхнем левом углу, как и ожидалось. Но после изменения размера
начало координат, похоже, сместилось вниз слева вверху. Кроме того, я рисую черный квадрат вокруг всего холста, поэтому во втором изображении появляется черная линия (опять же, как кажется, начало координат перемещается из верхнего левого угла).
Я использовал Инспектор элементов для проверки того, что холст физически все еще находится в верхнем левом углу и фактически не перемещается вниз по странице после изменения размера.
Кто-нибудь знает, как это исправить?
Редактировать: I только что попытался удалить SDL_Renderer и создать новый из окна, но это все еще не решило проблему.