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.