# 《星环弹弓》游戏设计文档（GDD）

> 版本 v1.0 · 作者：DSH 游戏组 · 状态：可开发
> 本文档是开发的权威规格：代码中的常量、数值、UI 文案均以此为准；如有出入以本文档为准并回改代码。

---

## 1. 一句话定义

**《星环弹弓》是一款"轨道充电 + 松手弹射"的物理休闲小游戏**：你的小飞船在星海中穿行，靠近星球自动入轨，按住屏幕给轨道充能、松开即沿切线弹射出去，靠引力链式弹射飞向更远深空。

平台：微信小游戏（竖屏、单指、单手可玩）。单局 30 秒~3 分钟，无限模式。

---

## 2. 核心玩法机制（Core Loop）

### 2.1 三层循环

| 层级 | 内容 | 时长 |
|---|---|---|
| 微观 | 入轨 → 按住充电 → 松手弹射 → 飞向下一颗星球 | 2~6 秒 |
| 中观 | 链式弹射积累连弹（Combo）× 收集星星 → 越飞越远 | 30 秒~3 分钟 |
| 宏观 | 冲新纪录 → 好友排行榜比拼 → 分享再挑战 | 跨局 |

### 2.2 操作（仅一根手指）

- **触摸按下（任意位置）**：若飞船处于飞行状态，无效果（等待自动入轨）；若已入轨，开始"充电"。
- **持续按住**：轨道半径持续收缩（充电值同步上升，0→1）；收缩到临界半径 → 烧毁坠毁（消耗 1 层护盾）。
- **松手**：飞船沿当前轨道切线方向弹射出去，弹射速度 = 轨道线速度 × (1.15 + 1.45 × 充电值)，并附加 45% 线速度的向外径向分量（保证一定逃逸）。
- **自动入轨**：飞行中进入某星球引力捕获圈（3.0 × 星球半径）即自动被捕获，进入稳定圆周轨道。**玩家无需瞄准**，考验的是"松手时机"（充电量与切线方向）。

### 2.3 为什么这个机制新颖（对比现有爆款）

| 竞品 | 核心操作 | 本作差异 |
|---|---|---|
| 跳一跳 | 按住蓄力、松手跳 | 本作**不需要瞄准/定位**，时机即一切；且轨迹被引力弯曲，有"引力弹弓"的物理爽感 |
| 合成大西瓜 | 点击投放、碰撞合并 | 本作是**连续运动 + 能量管理**，不是放置合成 |
| 羊了个羊 | 三消匹配 | 本作 30 秒一局的**即时手感**，无卡关挫败 |
| 弹一弹/弹球 | 弹射撞击 | 本作的核心是**轨道充能换速度**，节奏感更接近音游"长按/松手" |

一句话卖点：**"按住充电，松手弹射，让引力替你飙车"** —— 星战级物理爽感 + 音游式节奏 + 三秒上手的单手操作。

---

## 3. 物理与数值规格（权威数值表）

> 世界坐标单位：设计像素（design px）。屏幕设计宽 750，设计高按真机比例（约 1334~1624）。

### 3.1 引力

| 参数 | 符号 | 值 | 说明 |
|---|---|---|---|
| 引力常数 | G | 6200 | a = G·M / (d² + 900) |
| 软化项 | SOFT | 900 px² | 防奇点爆炸 |
| 最大加速度 | MAX_ACCEL | 4600 px/s² | 普通星球 |
| 黑洞加速度上限 | — | 4600 × 1.9 | 更强吸附 |
| 飞船最大速度 | MAX_SPEED | 2300 px/s | 超速按比例缩回 |

### 3.2 星球

| 参数 | 值 | 说明 |
|---|---|---|
| 半径 R | 38~120 px | 普通星球；黑洞 26~46 px |
| 质量 M | R²（黑洞 R²×2） | 与半径平方挂钩 |
| 捕获圈 | 3.0 × R | 进入即自动入轨 |
| 入轨半径 | clamp(d, 1.7R, 2.9R) | 平滑接管当前位置 |
| 轨道角速度 | ω = √(G·M / r³) | 开普勒第三定律 |
| 烧毁半径 | 1.12 × R | 轨道收缩至此 → 坠毁 |
| 过热预警半径 | 1.5 × R | 进入后 HUD 变红 |
| 被动收缩 | 6 px/s | 不按屏幕时轨道也缓慢收缩（制造行动压力） |
| 按住收缩 | 30 + 充电值×70 px/s | 充电越满缩得越快（风险与收益正相关） |

### 3.3 充电与弹射

| 参数 | 值 | 说明 |
|---|---|---|
| 充电速度 | 0.85 / 秒 | 约 1.18 秒充满 |
| 弹射倍率 | 1.15 + 1.45 × 充电值 | 充满约 2.6 倍线速度 |
| 向外分量 | 0.45 × 线速度 | 保证低充也能逃逸 |
| 完美弹射阈值 | 充电 ≥ 0.85 | 触发"完美弹射！"+80×Combo 奖励 |

### 3.4 计分

| 事件 | 分值 |
|---|---|
| 飞行距离 | 每 px +0.06（随距离累计） |
| 收集星星 | +50 × Combo |
| 完美弹射 | +80 × Combo |
| 里程碑 | 每 1000 m +150 × Combo，弹全屏彩带 |

- **Combo（连弹）**：每次成功入轨 +1（上限 20）；距上次入轨超过 6 秒归 1；坠毁归 1。
- **护盾**：初始 3 层；坠毁（烧毁/被黑洞吸入）扣 1 层并 1.8 秒无敌、从最近安全星球重生入轨；护盾耗尽再坠毁 → 游戏结束。
- **黑洞**：无捕获圈，引力 ×3.2；进入 2.3 × R 的"事件视界"即被吸入坠毁。

### 3.5 难度曲线（无限模式）

| 距离 | 内容 |
|---|---|
| 0~2000 m | 教学期：双星+一星，节奏舒缓，星星密集 |
| 2000~8000 m | 星球半径方差变大，间距 520~1350 px 拉大 |
| 8000 m+ | 黑洞出现概率 0.05→0.30 线性上升 |
| 全程 | 单屏维持 6 颗星球以内、12 颗星星以内；星球超出 2300 px 剔除，星星超出 1800 px 剔除 |

### 3.6 生成规则（可测试）

- 星球：在飞船周围 520~1350 px 环形带随机位置，拒绝与既有星球 < 300 px、与飞船 < 250 px（重试 16 次）。
- 黑洞占比 = min(0.05 + 难度 × 0.25, 0.30)。
- 完美弹射时沿发射方向 260/380/500 px 处各补 1 颗星星（正向奖励）。
- 开局固定：起始星球 (0,0) R=96（飞船直接入轨其上），次星 (1050,-120) R=72，第三星 (-850,380) R=58。

---

## 4. 美术风格

- **主题**：深空星海 + 低多边形霓虹。背景深靛蓝→紫渐变，三层视差星点（速度 0.15/0.30/0.55），2~3 团缓慢漂移的星云光晕。
- **星球**：径向渐变球体 + 辉光 + 可旋转行星环（60% 概率带环），呼吸脉动。六色主题：冰蓝 / 薄荷 / 橙金 / 玫粉 / 紫罗兰 / 柠檬。
- **黑洞**：纯黑视界盘 + 紫白吸积环（双层反向旋转）+ 紫色辉光。
- **飞船**：圆滚滚的小火箭，白体蓝窗，按住时喷橙色尾焰；入轨时显示青色充电环，过热时变红并抖动。
- **反馈**：弹射冲击环、入轨脉冲、星星四芒星爆闪、坠毁爆炸粒子、里程碑彩带；速度感靠星点拖影与轻微镜头缩放（速度 > 1400 时 zoom 0.86）。
- **字体**：系统黑体（PingFang SC / Microsoft YaHei），大数字加粗，关键数字发光（shadowBlur）。

## 5. 音效与震动（全部程序化生成，零外部素材）

| 文件 | 用途 | 特征 |
|---|---|---|
| launch.wav | 弹射 | 噪音扫频上扬 + 正弦 300→900Hz |
| capture.wav | 入轨 | 双音 blip（660/990Hz）短促 |
| star.wav | 星星 | 1320Hz + 1980Hz 泛音 ding |
| perfect.wav | 完美弹射 | 880/1100/1320 快速琶音 |
| crash.wav | 坠毁 | 低频爆音 110→40Hz |
| shield.wav | 护盾扣除 | 440→880Hz 上扬 |
| gameover.wav | 结束 | 660/494/392/330 下行 |
| milestone.wav | 里程碑 | 1046/1568 双音钟声 |
| click.wav | UI 点击 | 520Hz 短 blip |

震动：弹射/坠毁/完美触发 `wx.vibrateShort({type:'light'})`（异常静默忽略）。

## 6. UI 流程

```
菜单(标题/开始/说明/排行榜/音效开关/最高纪录)
  └→ 游戏(顶部 HUD：距离·得分·连弹·护盾·暂停；底部教学提示)
        └→ 结算(得分/纪录徽章/统计/再来一次/分享/排行榜/复活(广告))
```

- 教学提示按里程碑逐条浮现（见 3.5），4 秒淡出，不打断操作。
- 暂停：右上角按钮 / 切后台自动暂停；暂停遮罩 + 继续/重开/回菜单。
- 排行榜：开放数据域好友排行（好友/同城由平台配置决定）；结算页可直达。

## 7. 社交与增长

- **排行榜**：`wx.setUserCloudStorage` 提交 {score, maxcombo, distance}；开放数据域用 `wx.getFriendRank`（新版）并兜底 `wx.getFriendCloudStorage` 排序。
- **分享**：`wx.showShareMenu` + `wx.onShareAppMessage` 旋转文案 + 本地分享图 `assets/share.png`；结算页"邀请好友"按钮主动 `shareAppMessage`。
- **复活广告**：`AD_UNIT_ID` 配置（默认空=关闭）；激励视频看完复活（护盾=1、就近入轨）。

## 8. 版本路线（V1 之后）

1. V1.1 皮肤系统（飞船涂装/尾焰色，排行榜荣誉解锁）
2. V1.2 双人同屏竞速（同屏 split 单指）
3. V1.3 每日挑战（固定种子 + 目标距离）
4. V1.4 局内道具（磁吸/护盾补给/时缓）

## 9. 可测试性要求

- world 模块零依赖 wx，纯逻辑，Node 可直接单测（确定性种子 RNG）。
- 自动化用例：入轨数学、充电-弹射-逃逸、过热坠毁、黑洞无捕获+强吸、星星计分、Combo 窗口、护盾与游戏结束、生成不重叠、同种子同输入 → 结果一致。
- 冒烟测试：mock canvas + wx 跑完整 20 秒模拟对局不抛异常。
