Emscripten SDL2 - Происхождение холста перемещается при изменении размера холста - PullRequest
0 голосов
/ 29 марта 2020

Я только что реализовал изменение размера холста 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);

Перед изменением размера enter image description here черный квадрат можно увидеть в верхнем левом углу, как и ожидалось. Но после изменения размера enter image description here начало координат, похоже, сместилось вниз слева вверху. Кроме того, я рисую черный квадрат вокруг всего холста, поэтому во втором изображении появляется черная линия (опять же, как кажется, начало координат перемещается из верхнего левого угла).

Я использовал Инспектор элементов для проверки того, что холст физически все еще находится в верхнем левом углу и фактически не перемещается вниз по странице после изменения размера.

Кто-нибудь знает, как это исправить?

Редактировать: I только что попытался удалить SDL_Renderer и создать новый из окна, но это все еще не решило проблему.

1 Ответ

0 голосов
/ 30 марта 2020

ОК, так что у меня есть решение, которое работает, но я все равно буду готов услышать о любых лучших решениях.

В итоге я просто удалил объекты SDL_Renderer и SDL_Window и воссоздал их внутри обратного вызова. функция. Я понимаю, что это очень неэффективно, но я не могу найти какое-либо другое решение, которое работает, так что сейчас это нужно сделать.

...