Files
HexTrails/Design.md
T

165 lines
11 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.
# HEX TRAILS 设计规范
版本:1.0 · 2026-09-08 · 适用:网页、手机触摸界面与 Cocos 移植。
本文件规定设计角色和使用方式;`src/design-tokens.js` 是颜色数值的唯一来源。修改数值后运行 `npm run design`,同步生成 CSS、JSON、面板 PNG、对比度报告和可视化手册 `Design.html`。HTML 为单文件离线版本,包含原始图片、色值复制、组件示例、弹窗动效与本文全文。新界面不得另写一套 HEX 或用滤镜临时拼配色。
## 1. 设计方向
**清爽、明快、易读的哑光解谜游戏。** 环境采用冷蓝灰,棋盘采用暖白,主操作采用紫色。鲜艳的蓝、粉、黄、紫主要留给棋子;高饱和度不平均分配给每一个按钮。
- 棋子是第一视觉焦点,Level 和步数是第二层,工具是第三层。
- 纯色背景,无纹理、光晕、装饰圆盘。底板要看得出六边形分格。
- 棋子保持正顶视角、六边等长、小圆角;无侧面厚度和凹槽。
- 图标采用用户选定的**生成图集原始造型**,不得静默替换为另一套代码图形。
- 扁平面板搭配生成图标;保留图标原图细节,不用黑化、白化滤镜重塑外观。
## 2. 成熟模式如何用于本项目
采用 Material Design 3 的**语义颜色角色**:先定义颜色承担的职责,再给组件绑定角色;`primary / onPrimary`、`surface / textPrimary` 成对使用。采用层级明确的表面和主次操作,避免每个工具都争夺视觉注意力。[Material 3 主题与颜色角色](https://developer.android.com/codelabs/m3-design-theming?hl=en)
采用 W3C 的对比度方法作为验收约束:普通文字至少 4.5:1,大号文字和必要的非文字视觉标识至少 3:1。颜色之外还要用文字、图标、位移或选中标记表达状态。[文字对比度](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html) · [非文字对比度](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html)
这些来源提供方法和约束;下面的 HEX、游戏形态、动效时长是本项目的设计选择,并非 Material 官方游戏模板。当前为固定浅色主题,不随系统壁纸自动换色。
## 3. 颜色体系
### 3.1 环境与内容
| Token | 色值 | 用途与配对 |
|---|---|---|
| `background` | `#A8BECF` | 页面背景,搭配主文字或辅助文字 |
| `board` | `#F2EEE5` | 棋盘底格,暖白区分冷色背景 |
| `boardGrid` | `#7C8B94` | 六边形边界,细线且清楚可见 |
| `track` | `#6D808B` | 轨道中心线 |
| `trackHalo` | `#DFE3E2` | 轨道浅色外缘,不能盖断接头 |
| `surface` | `#F7F6F2` | 弹窗与编辑面板 |
| `textPrimary` | `#273B50` | Level、步数、标题、主要标签 |
| `textSecondary` | `#314A5F` | 说明与次要标签;用字号和字重区分层级 |
辅助文字不能通过大幅降低透明度来变淡。小字必须用规定的文字色,不使用旧版的浅紫灰。棋盘与背景的区别还包括完整轮廓、清晰分格和轨道,不只依赖色相差。
### 3.2 操作与状态
| Token / 配对 | 色值 | 用法 |
|---|---|---|
| `primary / onPrimary` | `#6652B8 / #FFFFFF` | 下一关、试玩、主要确认、当前选中关卡 |
| `secondary / textPrimary` | `#E4EAF0 / #273B50` | 重玩、普通选关、编辑器次级动作 |
| `utility / onUtility` | `#52697E / #FFFFFF` | 选关、设置、撤销、重来、提示的图标底板 |
| `selection / onSelection` | `#DFD9F3 / #3F327A` | 可扩展的弱选中状态 |
| `warningSurface / warning` | `#F9E3D2 / #A44825` | 阻挡、导入失败、不可解提示 |
| `reward` | `#B9760C` | 星星轮廓与奖励强调,限制面积 |
| `input / textPrimary` | `#FFFFFF / #273B50` | 输入框、选择框 |
| `disabled / onDisabled` | `#CBD4DD / #526579` | 原生移植的禁用表面和文字参考 |
| `scrim` | `#273B50`,透明度 48% | 模态遮罩,背景模糊 5px |
| `focus` | `#3F327A` | 键盘焦点外框 |
一张弹窗只安排一个高强调主操作。工具按钮统一用蓝灰底板,不再分别使用蓝、粉、黄。提示无需绿色“免费”角标;现有角标沿用中性表面。成功不额外引入薄荷绿,使用主操作色和星星表达。
编辑器的工具、方向、旋转和文件操作同样使用 `utility / onUtility`,保证生成白色图标在底板上可辨认;选中工具与试玩使用 `primary / onPrimary`。
### 3.3 棋子色与图片事实
棋子颜色不代表功能、品质或阵营。现有四枚棋子来自已接受的图片;以下是采样区域中心的代表值,图片像素允许存在小幅变化:
| Token | 代表色 | 方向箭头 |
|---|---|---|
| `tileBlue` | `#2392FD` | 白色 |
| `tilePink` | `#FC3E80` | 白色 |
| `tileYellow` | `#FDBC28` | 深蓝灰 `textPrimary` |
| `tilePurple` | `#874FFD` | 白色 |
黄色上的白箭头对比不足,因此使用深色箭头。四种棋子均可通过方向箭头、位置和运动判断,不要求辨认颜色才能通关。未经用户确认,不重新生成或调色替换已接受的棋子。
### 3.4 禁止的搭配
- 白色小字放在黄色、浅蓝灰或浅绿色按钮上。
- 使用同样的浅灰同时承担背景、底板和轨道。
- 紫色选中、绿色确认、黄色提示、粉色重来同时作为同等级操作。
- 用 `brightness / invert / saturate` 临时调面板色;这样无法核对实际颜色。
- 将语义警告色铺满常规棋盘,或只通过红色表示阻挡。
## 4. 组件规范
### 游戏主界面
顶部仅显示居中的 Level 与其下方的剩余步数。左侧选关,右侧设置。没有 Logo、关卡副标题、难度、待离场数量、角度读数或底部导航。
旋转操作为放大的生成箭头,下方分别写“左转”“右转”,不加矩形底板。文字用主文字色;白色箭头允许轻微蓝灰轮廓阴影增强边缘识别,不能改写原图轮廓。它们须保留至少 44×44 的触摸区域。
撤销、重来、提示使用相同的工具底色和图标规格,下方标签不少于 12px。禁用时确实停止操作,网页透明度为 55%;不得只有颜色变化却仍可点击。
### 棋盘和轨道
先画全部底格,再画分格线,再统一画轨道外缘与中心线,最后画棋子。相邻格子连接端口必须完全重合。内部不留透出背景的缝;外边缘需为线帽预留空间。分格线宽取 `max(1.25px, 格子半径 × 0.038)`。
棋子保持微小圆角。所有游戏运动、碰撞和绘制使用同一坐标体系。图片只能在原图不透明、无杂点的区域采样;不得带入棋盘格底纹或透明噪点。
### 弹窗
所有弹窗使用暖白表面,标题主文字色、正文辅助文字色。主按钮紫色配白字,次按钮中性表面配深字。正文推荐 13–14px、行高 1.75;弹窗圆角 24px、左右留白至少 24px。
弹窗必须是真正的模态层:使用 `showModal()`,背景变暗并模糊,鼠标、触摸和键盘均不能操作后方控件。结果弹窗不能通过点击背景意外消失;下一关或重玩后关闭。设置/选关允许点击外部关闭,但该次点击不可传给后方按钮。
选关数字与难度说明保留,当前关卡使用主操作色,并附当前状态。未通关不以灰到不可读的文字表示。
## 5. 图标与图片资产
| 内容 | 当前资源 | 使用规则 |
|---|---|---|
| 生成图标 | `assets/ui-icons-generated.png` | 原始生成图的逐字节副本,1254×1254 |
| 图标裁切 | `src/ui-skin.js` 中 `ICONS` | 按主图形测量,四周留白后裁成正方形并居中 |
| 面板颜色 | `assets/ui-surfaces.png` | 从 token 输出的纯色 PNG,13 个 32×32 色块 |
| 棋子 | `assets/tiles-matte-clean-v8.png` | 中央干净色块采样 + 共用圆角正六边形遮罩 |
图标生成源文件:`exec-64bcb2ee-fa31-48f9-9a7e-3e2c8c327520.png`。这一套包括选关、设置、左右转、撤销、重来、提示、星星等。`ui-icons-flat.png` 是此前代码重绘版,保留作历史文件,**不再被当前界面引用**。
面板仅采样每个色块中央的 28×28 区域,四周预留 2px,防止放大和双线性过滤时混入相邻色块。
不重绘用户已选图标、不换形状、不强制黑白化。当前白色图标置于 `utility` 底板上;旋转箭头和星星可用 token 定义的轻微轮廓阴影。正方形 SpriteFrame 等比显示,不能把窄图标拉宽。SVG 和 Unicode 字符不得临时顶替正式图标。
生成原图透明区仍可能有细小边缘噪点;当前做的是主图形裁切,未宣称对原 PNG 完成像素级清理。若实机仍可见噪点,应清理同一素材并重新验收,不能静默更换图标系统。
## 6. 字体、间距与形状
| 层级 | 规格 |
|---|---|
| Level | 28px,粗体,居中 |
| 剩余步数数字 | 32px,粗体,居中 |
| 弹窗标题 | 24px,粗体 |
| 正文 | 13–14px,行高 1.75 |
| 操作标签 | 12–13px |
| 次要说明 | 至少 11px;不靠低透明度弱化 |
使用当前圆润系统字体回退栈,中文优先 PingFang SC / Microsoft YaHei。Cocos 上若要求字宽一致,应嵌入同一授权字体后验收,不能只复制字体名称。
间距使用 4px 基础单位,常用 8/12/16/24/32px。控件圆角 14px,弹窗 24px,小角标 8px。移动端安全区不得遮住底部操作,常规点击区至少 44×44px;图标本身可以小于点击区。
## 7. 动效、音效与反馈
- 按压:150ms,缩放到 94%;不移动命中区域。
- 弹窗:420ms,从上方 60px 和 96% 缩放进入;遮罩约 250ms。
- 星星:分别延迟 300/490/680ms 出现,每枚动画 400ms。
- 碰撞:总长 1250ms,先接近,再接触停顿并让阻挡棋子轻震,最后原路弹回;不改变模型中的位置。
- 音效:首次手势后启动,点击、旋转、离场、碰撞和通关各有短音;设置里可关闭并保存偏好。
- `prefers-reduced-motion` 下取消非必要位移、缩放和震动,仍保留状态文字。
- 手机棋盘禁用 WebKit tap highlight、选中文字和长按菜单,避免整块矩形高亮。
## 8. 验收与变更流程
当前生成的精确对比度见 `design/contrast-report.json`,来自 W3C sRGB 相对亮度公式;校验的是不透明 token 配对。代表结果:主文字/背景约 5.98:1,辅助文字/背景约 4.80:1,白字/主按钮约 6.06:1,轨道/底板约 3.55:1。
透明 PNG、抗锯齿、阴影、真实字体和禁用态仍需在实际画面检查。对比度报告不等于整个游戏已获得 WCAG 合规认证。
每次视觉修改按此顺序:
1. 明确修改哪个语义角色,优先复用现有角色。
2. 修改 `src/design-tokens.js`,运行 `npm run design`。
3. 检查自动生成的 PNG/CSS/JSON 和对比度报告。
4. 运行 `npm test`、`npm run build`。
5. 检查 390×844 手机布局,以及较矮屏幕;检查主界面、选关、设置、通关/失败和碰撞状态。
6. 验证弹窗不能穿透操作、图标居中、轨道接缝不断裂。
7. 如需替换已接受的图片,明确告知用户素材来源和变化,再更新本表。
Cocos 读取同一 JSON/JS token 和 PNG。`CandyUiSkin` 使用纯色 Sprite、圆角 Mask 和居中的图标;不得在原生侧另外猜颜色。本规范与适配组件已提供,原生场景尚需导入后做视觉验收。