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; scaleX: number; scaleY: number; uiScale: number; vScale: number; centerX: number; centerY: number; isLandscape: boolean; } /** * Layout Canon(Phaser 绑定)。 * * 基于 750×1334 设计稿,统一计算 UI 适配参数: * - uiScale = clamp(min(scaleX, scaleY), minScale, maxScale) * - vScale = scaleY(仅随高度变化,用于贴底/贴顶垂向距离) * * @see responsive_2d_layout.aicomponent SKILL.md 第一节 */ 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; const isLandscape = width > height; return { camera, width, height, scaleX, scaleY, uiScale, vScale, centerX, centerY, isLandscape, }; }