feat: 初始化西安旅行记忆互动地图游戏项目

完成项目基础搭建:配置 Vite 开发构建环境,集成 Phaser 3 与虚拟摇杆插件,实现地图漫游、景点触发、拍立得弹窗、进度存档等核心功能,添加占位资源与批量生成脚本,配置项目元数据与忽略规则。
This commit is contained in:
Stephen committed 2026-10-17 18:01:46 +08:00
commit a404e42ca8
42 files changed
+5489

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
/**
* @fileoverview DOM UI 层管理器(dom-layer)。
*
* 文件用途:
* - 挂载并协调全部 DOM UI 组件(封面 / 拍立得弹窗 / HUD / 纪念页 / 竖屏提示)。
*
* 核心职责:
* 1. 组件生命周期:mount 后由各组件自行监听 eventBus 事件驱动显示;
* 2. 维护 inputReleased 标志:封面"开始旅行"放行输入(MapScene 可能晚于
* 事件创建,需在 create 时回查该标志,避免输入锁死);
* 3. 组件互斥由组件自身在 show/hide 时控制,层管理器只负责装配。
*
* 主要流程:
* main.js 调用 mountUi() → 各组件挂载到 #ui 容器 → TitleOverlay 首屏
* 显示 → 用户交互 → 各组件 show/hide 并通过 eventBus 通知 Phaser 层。
*/
import { eventBus } from '../event-bus.js';
import * as gameState from '../game-state.js';
import { TitleOverlay } from './TitleOverlay.js';
import { PhotoModal } from './PhotoModal.js';
import { Hud } from './Hud.js';
import { CompleteOverlay } from './CompleteOverlay.js';
import { initRotateHint } from './rotate-hint.js';
/**
* 游戏输入是否已被 UI 放行(封面页"开始旅行"后为 true)。
*
* @type {boolean}
*/
export let inputReleased = false;
/**
* 放行游戏输入并广播 ui:closed(MapScene create 晚于事件时回查本标志)。
*
* @returns {void}
*/
export function releaseInput() {
inputReleased = true;
}
/**
* 装配 DOM UI 层:创建根节点并挂载全部组件。
*
* @returns {void}
*/
export function mountUi() {
const root = document.getElementById('ui');
// 事件桥上暴露放行动作,供封面页调用。
eventBus.on('ui:release-input', () => releaseInput());
const hud = new Hud(root);
const title = new TitleOverlay(root);
const photoModal = new PhotoModal(root);
const complete = new CompleteOverlay(root);
// 组件装配后初始化:封面首屏显示(覆盖资源加载过程),其余待事件驱动。
title.show({
hasSave: gameState.hasSave(),
snapshot: gameState.loadProgress(),
});
hud.init();
initRotateHint();
}