import * as Phaser from 'phaser'; import { GameConfig } from '../GameConfig'; export interface UiLayoutConfig { baseWidth?: number; baseHeight?: number; minScale?: number; maxScale?: number; } export interface UiLayoutResult { camera: Phaser.Cameras.Scene2D.Camera; width: number; height: number; uiScale: number; vScale: number; centerX: number; centerY: number; } /** * 实现 `responsive_2d_layout.aicomponent` SKILL.md 第一节 Layout Canon(Phaser 绑定)。 * 统一计算基于 750x1334 设计稿的 UI 适配参数。 * * - uiScale: 以宽高比例中较小值为基准,并限制在 [minScale, maxScale] * - vScale: 仅基于高度的缩放系数,用于纵向坐标(设计稿 Y * vScale) */ export function computeUiLayout( sceneOrCamera: Phaser.Scene | Phaser.Cameras.Scene2D.Camera, config: UiLayoutConfig = GameConfig, ): UiLayoutResult { const camera = sceneOrCamera instanceof Phaser.Scene ? sceneOrCamera.cameras.main : sceneOrCamera; const { width, height } = camera; const baseWidth = config.baseWidth ?? 750; const baseHeight = config.baseHeight ?? 1334; const scaleX = width / baseWidth; const scaleY = height / baseHeight; const minScale = config.minScale ?? 0.7; const maxScale = config.maxScale ?? 1.4; const rawUiScale = Math.min(scaleX, scaleY); const uiScale = Phaser.Math.Clamp(rawUiScale, minScale, maxScale); const vScale = scaleY; const centerX = width * 0.5; const centerY = height * 0.5; return { camera, width, height, uiScale, vScale, centerX, centerY }; }