← На главную
Серия практических разборов

Единый источник состояния для изменения размера

Адаптивная вёрстка HTML5-игры для Poki • Раздел 3 из 11

2. Единый источник состояния для изменения размера

За состояние экрана отвечает engine/screen/ScreenManager.ts. Он:

  • читает visualViewport, когда тот доступен;
  • слушает resize и orientationchange;
  • пересчитывает снимок состояния экрана;
  • обновляет рендерер PIXI;
  • уведомляет подписчиков.

События изменения размера не запускают все пересчёты вёрстки немедленно. Сначала они проходят через ResizeScheduler:

request(): void {
  if (this.scheduled) return;
  this.scheduled = true;
  requestAnimationFrame(() => {
    this.scheduled = false;
    this.handler();
  });
}

Это предотвращает лишние пересчёты при изменении размера окна браузера или ориентации устройства.

После изменения снимка экрана движок отправляет SCREEN_CHANGED. Игровой код реагирует на это нормализованное событие, а не на нативное изменение размера в браузере.

Пример:

this.unsubscribeScreen = this.node.events.on(SharedUiEvents.ScreenChanged, () => {
  this.applyLayout();
});

Этот шаблон используется в LevelPanelComponent, ItemSceneLayoutComponent, LevelBackgroundComponent и LevelCompletionOverlayComponent.