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:
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user