Files
tianshu-engine/README.md

154 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 交互式电影游戏引擎
基于 Vue 3 + TypeScript 的浏览器端交互式电影游戏引擎。
**零代码门槛**:你只需要会剪视频和写 JSON不需要前端知识。
## 快速开始
```bash
git clone <repo-url> mygame
cd mygame
npm install
npm run dev
```
打开 `http://localhost:5173/`,你会看到示例剧情。
## 制作你的游戏
### 1. 准备素材
| 素材 | 目录 | 格式要求 |
|------|------|---------|
| 视频文件 | `public/videos/` | MP4 (H.264)1280×72030fps2-5Mbps |
| 背景音乐 | `public/audio/` | MP3 |
| 缩略图 | `public/images/` | JPG/PNG320×180 |
| 字幕 | `public/subtitles/` | WebVTT (.vtt) |
> `public/videos/` 已在 `.gitignore` 中,视频文件不需要提交到 Git。
### 2. 编写剧情 JSON
编辑 `public/scenes/demo.json`,定义你的场景和分支。**最小可玩示例只需 20 行 JSON**
```json
{
"startScene": "intro",
"variables": { "trust": 50 },
"scenes": {
"intro": {
"id": "intro",
"videoUrl": "/videos/intro.mp4",
"choices": [
{ "text": "帮助他", "targetScene": "help_end" },
{ "text": "离开", "targetScene": "leave_end" }
]
},
"help_end": {
"id": "help_end",
"videoUrl": "/videos/help.mp4",
"choices": []
},
"leave_end": {
"id": "leave_end",
"videoUrl": "/videos/leave.mp4",
"choices": []
}
}
}
```
完整字段参考见 **[docs/SCENE_JSON_SPEC.md](docs/SCENE_JSON_SPEC.md)**。
### 3. 实时预览
```bash
npm run dev
```
Vite 会启动热重载服务器,修改 JSON 或视频后自动刷新。
### 4. 可视化编辑剧情
浏览器打开 `http://localhost:5173/editor/`,可以用节点图编辑器拖拽编辑场景分支。
## 打包发布
```bash
npm run pack:html # Web 版 → release/mygame.zip → 上传 itch.io / Netlify
npm run pack:mac # macOS → release/MyGame-darwin-arm64/
npm run pack:win # Windows → release/MyGame-win32-x64/
```
打包前会自动验证 JSON 合法性。
## 引擎功能
| 功能 | 说明 |
|------|------|
| 视频分支播放 | A/B 双缓冲无缝切换300ms 交叉淡化 |
| 选择系统 | 限时选择、条件分支(根据变量显示/隐藏选项) |
| QTE 快速反应事件 | 视频中插入限时按键挑战,成功/失败跳转不同场景 |
| 图片/视频热点 | 点击画面区域触发分支,视频热点按时间轴显隐 |
| 循环等待 | 视频结束后自动循环指定片段,保持画面动态 |
| 独立 BGM | 背景音乐独立驱动,场景切换时交叉淡化,不受画面循环影响 |
| BGM Ducking | 选择/QTE/热点出现时 BGM 自动降低音量 |
| 字幕系统 | WebVTT 解析,多语言字幕切换 |
| 章节系统 | 分章节管理剧情,到达即解锁,可跳转 |
| 成就系统 | 变量满足条件时自动解锁,底部弹窗提示 |
| 结局画廊 | 所有结局缩略图展示,已解锁/未解锁状态 |
| 章节回顾 | 每章完成度百分比 + 未解锁分支条件提示 |
| 关键选择提示 | 重要选项前置金色标识 + 选后浮现提示文字 |
| 跳过已看 + 倍速 | 已看场景可跳过1x/2x/4x 倍速播放 |
| 全屏模式 | 一键全屏沉浸式浏览器体验 |
| 键盘导航 | 方向键选选项Esc 菜单Space 暂停 |
| 多语言 i18n | UI + 字幕支持中英文切换 |
| 可访问性 | 字幕字号/背景、QTE 时限放宽/按键简化、防误触延迟 |
| 存档系统 | IndexedDB 多槽位,跨会话持久化 |
## 目录结构
```
mygame/
├── engine/ # 引擎核心(纯 TS不依赖 Vue
│ ├── core/ # Engine / VideoManager / StateManager / SceneManager
│ ├── systems/ # QTE / Choice / Audio / Achievement / Save
│ └── types.ts # 类型定义
├── src/ # Vue UI 层
│ ├── components/ # 所有界面组件
│ ├── composables/ # 引擎 ↔ UI 桥接
│ ├── stores/ # Pinia 状态管理
│ └── locales/ # 翻译文件zh.json / en.json
├── editor/ # 可视化剧情编辑器
├── electron/ # 桌面应用打包Electron
├── public/ # 你的素材
│ ├── videos/ # 视频文件(.mp4
│ ├── audio/ # 背景音乐(.mp3
│ ├── images/ # 缩略图
│ ├── subtitles/ # 字幕(.vtt
│ └── scenes/demo.json # 剧情定义
├── docs/ # 文档
│ └── SCENE_JSON_SPEC.md # JSON 完整字段参考
├── scripts/ # 打包脚本
└── ROADMAP.md # 开发路线图
```
## 视频制作建议
| 参数 | 建议值 |
|------|--------|
| 视频不包含 BGM | 背景音乐用独立 .mp3 文件 + `bgmUrl` 字段,画面循环时 BGM 不中断 |
| 循环片段 | 正文段 + 循环段合成为一个文件,用 `loopStart`/`loopEnd` 标记 |
| 字幕 | WebVTT 格式,时间轴精确到毫秒 |
## 命令参考
```bash
npm run dev # 启动开发服务器(实时预览)
npm run build # 构建生产版本
npm run preview # 预览构建结果
npm run pack:html # 打包 Web 版
npm run pack:mac # 打包 macOS 桌面应用
npm run pack:win # 打包 Windows 桌面应用
```