feat: electron packaging, build scripts, gitignore and docs update
This commit is contained in:
78
ROADMAP.md
78
ROADMAP.md
@@ -925,6 +925,84 @@ QTE 成功 / 到达隐藏结局 / 通关等"事件型"成就,通过在对应 e
|
||||
- [x] `src/App.vue` — 使用 `MainMenu` 替代散装 `start-overlay` 按钮 + `game-end-overlay`;移除 60 行旧 CSS
|
||||
- [x] 验证:TypeScript + Vite build 通过
|
||||
|
||||
### P18 视频加载失败恢复(待实现)
|
||||
|
||||
目标:视频加载失败时显示错误画面 + 重试/跳过按钮,不再 `play().catch(() => {})` 静默黑屏。
|
||||
|
||||
**改动点:**
|
||||
|
||||
- [ ] `engine/core/VideoManager.ts` — `play`/`switchTo` 增加错误回调(`onerror` 事件 + `play()` reject);
|
||||
超时检测(5 秒未 `canplay` 视为失败);重试逻辑(最多 3 次,指数退避 1s/2s/4s)
|
||||
- [ ] `src/components/VideoErrorOverlay.vue` — 错误画面:警告图标 + "视频加载失败" + [重试] [跳过此场景] 按钮
|
||||
- [ ] `src/stores/gameStore.ts` — `videoError` 状态(`{ sceneId: string, message: string, retryCount: number }`)
|
||||
- [ ] `src/App.vue` — 整合 VideoErrorOverlay;跳过逻辑重试当前场景或调用 `engine.skipCurrentScene()` 强制跳过
|
||||
- [ ] 验证:断网播放 → 错误画面 → 重试恢复 → 跳过进入下一场景
|
||||
|
||||
### P19 制作者工具链 — HTML / macOS / Windows 打包 ✅ 已完成 2026-06-09
|
||||
|
||||
目标:制作者 clone `moviegame` 源码后可直接开发。`npm run dev` 已有 Vite HMR 实时预览,
|
||||
提供三行命令打包为 Web zip、macOS 可执行应用、Windows 可执行应用。
|
||||
|
||||
**命令设计:**
|
||||
|
||||
```bash
|
||||
npm run dev # Vite 实时预览(已有)
|
||||
npm run pack:html # 打包 Web 版 → release/mygame.zip → 上传 itch.io (HTML)
|
||||
npm run pack:mac # 打包 macOS → release/MyGame-darwin-arm64/ 可执行文件夹
|
||||
npm run pack:win # 打包 Windows → release/MyGame-win32-x64/ 可执行文件夹
|
||||
```
|
||||
|
||||
**实施方案:**
|
||||
|
||||
| 工具 | 技术 | 选择原因 |
|
||||
|------|------|---------|
|
||||
| Web 打包 | `vite build` + `zip dist/` | Vite 标准做法,产物直接上传 itch.io |
|
||||
| 桌面打包 | Electron + **`@electron/packager`** | 比 `electron-builder` 简单:一行 CLI,零配置,不需安装向导。产出的可执行文件夹本地可直接双击运行,也可以直接分发 |
|
||||
|
||||
**Electron 包装结构:**
|
||||
|
||||
```
|
||||
electron/
|
||||
├── main.js # Electron 主进程,全屏 + 加载 dist/index.html
|
||||
└── package.json # electron + @electron/packager 依赖
|
||||
```
|
||||
|
||||
核心逻辑:
|
||||
|
||||
```js
|
||||
// electron/main.js
|
||||
const { app, BrowserWindow } = require('electron')
|
||||
|
||||
app.whenReady().then(() => {
|
||||
new BrowserWindow({
|
||||
fullscreen: true,
|
||||
autoHideMenuBar: true,
|
||||
webPreferences: { nodeIntegration: false }
|
||||
}).loadFile('dist/index.html')
|
||||
})
|
||||
|
||||
app.on('window-all-closed', () => app.quit())
|
||||
```
|
||||
|
||||
```bash
|
||||
# pack:mac
|
||||
npx @electron/packager . MyGame --platform=mas --arch=arm64,x64 --out=release
|
||||
|
||||
# pack:win
|
||||
npx @electron/packager . MyGame --platform=win32 --arch=x64 --out=release
|
||||
```
|
||||
|
||||
**实现清单:**
|
||||
|
||||
- [x] `scripts/pack-html.cjs` — `vite build` + JSON 验证 + 复制 public 资源 + zip 打包
|
||||
- [x] `electron/main.js` — Electron 主进程,全屏窗口 + 加载 dist
|
||||
- [x] `electron/package.json` — `electron` + `@electron/packager` 依赖 + pack scripts
|
||||
- [x] `package.json` — 新增 `pack:html`/`pack:mac`/`pack:win` scripts
|
||||
- [x] `README.md` — 面向制作者重写入门指南
|
||||
- [x] `public/videos/` — 只保留 1 个示例视频
|
||||
- [x] 删除 `moviegame-starter` 目录
|
||||
- [x] 验证:`pack:html` 生成 release/mygame.zip
|
||||
|
||||
## 依赖清单
|
||||
|
||||
```json
|
||||
|
||||
Reference in New Issue
Block a user