HTML5 重写:6 款游戏 + 用户系统 + 全局设置 + 5 轮迭代重构

- 新增 web/ 纯音频 HTML5 平台:共享引擎(手势/WebAudio 三层/设置/震动)、
  Node 零依赖服务器(静态 + 注册登录 + 进度存档 API)
- 游戏:剑与声(RPG 新作)、声命线、暗室(重设计)、音序回响(重设计)、
  节拍行者(跟随领奏重构)、盲航(同向闪避重构);声东击西删除
- 全局功能:男声/女声双套 TTS 资产、三档语速、BGM 音量三档、
  震动反馈语言(10 种震型)、服务器进度同步
- 资产:899 ogg + 899 m4a(Qwen3-TTS 双性别语音、Stable Audio 3 音效、
  Mureka BGM 4+3 首),终检零缺失
- 文档:docs/design/ 13 篇设计审查文档、docs/audio/ 资产管线、
  web/server/README.md API 文档
This commit is contained in:
SoundGame Dev
2026-08-29 21:55:44 +08:00
parent f0f0a9b50e
commit cc0f8c008d
1885 changed files with 11246 additions and 5 deletions
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

+27
View File
@@ -0,0 +1,27 @@
/**
* 模板游戏 —— 最小可运行示例:任意手势播一个测试音。
*
* 新游戏复制整个 web/template/ 目录为 web/<你的游戏名>/,然后:
* 1. 把本文件替换成你的游戏逻辑(继承 Game 或 StateMachineGame);
* 2. 替换 index.html 里的 <title> 和 import 的类名;
* 3. 音频放 audio/{bgm,voice,sfx}/ 下,用 audio.play('sfx/xxx') 播放;
* 4. 替换 cover.png(1080x1920 竖图)。
* 引擎 API 详见 docs/web-engine-api.md。
*/
import { Game } from '../engine/game.js';
export class TemplateGame extends Game {
start() {
// 预解码音效,消除首次播放延迟(等价于 Android 的 prewarm,
// 但 Web 端不需要音量 0 假播)
this.audio.prewarm(['sfx/beep']);
this.audio.play('sfx/beep');
}
onGesture(g) {
// 六种手势:'up' | 'down' | 'left' | 'right' | 'tap' | 'doubletap'
// 注意 'tap' 有约 300ms 延迟(双击判定窗口),属引擎级行为。
console.log('[TemplateGame] gesture:', g);
this.audio.play('sfx/beep');
}
}
+42
View File
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- viewport 锁缩放,viewport-fit=cover 适配刘海屏 -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
<title>模板游戏 · SoundGame Web</title>
<link rel="stylesheet" href="../engine/style.css">
</head>
<body>
<!-- 全屏根元素:手势全屏捕获层,封面图放里面 -->
<div id="game-root">
<img class="cover" src="cover.png" alt="">
</div>
<!--
标准接线流程(每个游戏都一样,复制这段改 game.js 路径即可):
1. new WebAudioEngine('audio/') —— basePath 相对本页面
2. new MyGame(audio, root)
3. await audio.showStartOverlay() —— 遮罩"轻触开始",首次点按解锁音频
4. game.start() + attachGestures() —— 解锁后才接管手势,避免开始那次点按误触
-->
<script type="module">
import { WebAudioEngine } from '../engine/audio.js';
import { attachGestures } from '../engine/gesture.js';
import { TemplateGame } from './game.js';
async function main() {
const root = document.getElementById('game-root');
const audio = new WebAudioEngine('audio/');
const game = new TemplateGame(audio, root);
await audio.showStartOverlay({ cover: 'cover.png', text: '轻触开始' });
// 走到这里 AudioContext 已解锁,可以出声了
game.start();
attachGestures(root, (g) => game.onGesture(g));
}
main();
</script>
</body>
</html>