九霄轮回录(五)表现与技术:从 320×180 到一套能跑的架构
《九霄轮回录》设计文档系列 一 · 总览 · 二 · 八个角色 · 三 · 关卡与 Boss · 四 · 系统设计 · 五 · 表现与技术(本篇)
一、先把"看起来像什么"钉死
参考坐标我定得很明确:Dead Cells × Hyper Light Drifter × 东方仙侠。
这三个放在一起,意思是——要 Dead Cells 那种高帧数的流畅动作,要 Hyper Light Drifter 那种克制的色彩和光影,题材和意境走东方仙侠。
风格关键词五个:现代像素、高帧动画、动态光影、粒子特效、水墨意境。
技术规格
基础分辨率:320×180(16:9)
像素密度:角色 16×24 ~ 24×32 像素
Boss 基础:48×48 ~ 96×96 像素
Tile 大小:16×16 像素
调色板:每重天限定 32 色(总计 288 色)
缩放:整数倍缩放至目标分辨率(×6 = 1920×1080)
320×180 这个数字是整套美术的地基。 它很小——小到你画一个角色只有 20 来个像素宽。这是刻意的:分辨率越低,每一像素的权重越高,画面越"紧"。
"整数倍缩放"是硬要求。 320×180 按 6 倍放大正好是 1920×1080。用非整数倍(比如 ×5.7)会让像素大小不一致,出现有的像素 5 个点宽、有的 6 个点宽——那是最典型的"廉价像素游戏"观感。
每重天一套色板
整个游戏共享一套通用色:
角色皮肤:#F5D6B8, #D4A574, #8B6B4A
血液效果:#CC3333, #FF6644
UI 颜色:#FFFFFF, #000000, #FFD700(金), #88CCFF(灵力蓝)
特效高光:#FFFFFF, #FFFF00, #FF00FF
阴影:#000000 @ 30% / 50% / 70% 不透明度
再叠上每重天自己的 32 色。以尘世天为例:
#2D5016 深绿(阴影植被) #4A7C59 中绿(草地)
#7CB342 亮绿(阳光草地) #8B6914 棕褐(土地)
#A0522D 深棕(树干) #DEB887 浅棕(沙地)
#87CEEB 天蓝 #4682B4 深蓝(水面)
#F5F5DC 米白(云) #D2691E 赤褐(屋顶)
#696969 灰色(石墙) #A9A9A9 浅灰(石板路)
元素特效也有固定配色,整个游戏统一:
| 元素 | 主色 | 副色 | 粒子类型 |
|---|---|---|---|
| 金 | #FFD700 | #FFF8DC | 金属碎片 |
| 木 | #228B22 | #90EE90 | 树叶/花瓣 |
| 水 | #1E90FF | #87CEEB | 水滴 |
| 火 | #FF4500 | #FFD700 | 火星/烟 |
| 土 | #8B4513 | #DEB887 | 碎石/尘土 |
| 雷 | #00BFFF | #FFFFFF | 电弧/火花 |
| 冰 | #B0E0E6 | #FFFFFF | 冰晶/雪花 |
| 毒 | #32CD32 | #9400D3 | 毒液泡 |
| 暗 | #4B0082 | #8B008B | 暗影/紫烟 |
| 光 | #FFD700 | #FFFFFF | 光点/星尘 |
| 混沌 | #8B008B | #FF0000 | 扭曲空间 |
| 天道 | #FFD700 | #FFFFFF | 金色光尘 |
为什么元素配色要全局统一而不是每重天各来一套? 因为战斗信息必须一眼可读。玩家在混战里判断"这团紫色是毒还是暗",靠的只能是颜色。如果幽冥天把毒改成绿色系,玩家在那儿就会误判。
风格可以变,信息的编码不能变。
二、动画:帧数是一种语言
帧率标准:
游戏逻辑帧率:60 FPS
动画帧率:12 FPS(标准)/ 24 FPS(Boss)
角色动画的帧数规格:
待机 Idle: 6~10 帧,循环
行走 Walk: 8 帧 × 4 方向
奔跑 Run: 6 帧 × 4 方向
攻击 Attack: 8~12 帧
技能 Skill: 10~16 帧
受击 Hurt: 3~4 帧
死亡 Death: 10~20 帧(不循环)
闪避 Dodge: 4~6 帧
终极技能 Ultimate:16~24 帧
Boss 则要夸张得多:
待机:8~10 帧 移动:8 帧
攻击:10~14 帧 特殊技能:14~20 帧
阶段转换:20~30 帧 死亡:20~40 帧
帧数不是随便定的,它在传达重量。
受击只有 34 帧,死亡有 1020 帧——这个对比本身就说明了"轻"和"重"。血无归的受击动画我特意压到 3 帧(全角色最少),因为他是硬汉,挨打不该有夸张反应;而叶无尘有 4 帧,还带闪白和格挡姿态。
同样的道理,Boss 的死亡动画给到 20~40 帧。玩家打赢 Boss 之后那几秒钟,是整局游戏情绪最高的时候,值得用最多的帧数去表现。
受击反馈
敌人受击:闪白 1 帧 + 击退 + 屏幕震动(轻微)
玩家受击:闪红 1 帧 + 无敌帧闪烁 + 屏幕震动(中等)
Boss 受击:闪白 1 帧 + 局部碎裂粒子
"闪白 1 帧"是动作游戏手感的命门。 它必须只有 1 帧——2 帧就腻了,完全没有又像在砍空气。这个细节没有理论,只能靠手感调。
死亡特效
普通敌人:碎裂为像素碎片,对应元素颜色
精英敌人:慢动作碎裂 + 光柱效果
Boss:专属死亡动画 + 掉落物光柱 + 环境变化
特效分层
Layer 0:地面效果(冰面、火海、毒雾)
Layer 1:角色本体
Layer 2:近战特效(剑光、爪痕)
Layer 3:远程弹道(火球、雷击)
Layer 4:空中效果(落雷、陨石)
Layer 5:UI 叠加(伤害数字、Buff 图标)
分层是为了解决一个很具体的问题:特效互相遮挡。寒江雪的冰面在 Layer 0,敌人的本体在 Layer 1,所以冰面永远不会盖住敌人;而落雷在 Layer 4,永远在最上面。
动画制作流程
1. 概念设计 → 像素草稿(8×8 ~ 16×16)
2. 关键帧绘制 → 确定动作节奏
3. 中间帧补全 → 确保流畅
4. 特效叠加 → 元素效果、粒子
5. 光影调整 → 受击闪白、阴影变化
6. 动画测试 → 在游戏中实际运行测试
7. 优化 → 减少颜色数量,优化调色板
第 7 步经常被忽略。像素动画画到后面很容易颜色越用越多,最后发现整张图的调色板失控了。定期回头看用了多少种颜色,是像素美术的基本纪律。
三、音乐:十三轨
| 场景 | 风格 | BPM | 乐器 |
|---|---|---|---|
| 主菜单 | 古琴+电子合成器 | 80 | 古琴、竹笛、合成器 pad |
| 尘世天 | 中国风轻快 | 110 | 竹笛、琵琶、鼓 |
| 风云天 | 空灵飘逸 | 90 | 古筝、风铃、弦乐 |
| 雷泽天 | 紧张激烈 | 140 | 大鼓、铜锣、电吉他 |
| 幽冥天 | 阴森诡异 | 70 | 二胡低音、风声、铁链 |
| 烈焰天 | 激昂热血 | 150 | 大鼓、唢呐、铜管 |
| 玄冰天 | 冷冽空灵 | 60 | 管钟、水晶琴、弦乐 |
| 心魔天 | 迷幻扭曲 | 变化 | 失真古琴、反向音效 |
| 混沌天 | 不和谐 | 无固定 | 工业噪音、扭曲音效 |
| 天道天 | 宏大史诗 | 120 | 全乐器交响 |
| Boss 战 | 激烈战斗 | 160 | 全乐器 + 电子 |
| 商店 | 轻松愉快 | 100 | 琵琶、笛子 |
| 死亡/轮回 | 悲伤→希望 | 60→90 | 古琴独奏→渐入弦乐 |
BPM 就是情绪曲线:玄冰天 60 是全场最慢,烈焰天 150 是最快;心魔天没有固定 BPM,因为它本来就该让人不安。
「死亡/轮回」那轨从 60 爬到 90,配合的是从"又失败了"到"再来一次"的心理转折。玩家在轮回界面上停留的时间,决定了他下一局的心态。
音效方面,每个角色的攻击音效按元素区分;战斗 BGM 与探索 BGM 之间做平滑过渡;Boss 登场有专门的音效加音乐转场。
四、界面
HUD 布局:
┌─────────────────────────────────────────────┐
│ [HP条] ████████░░░░ 80/100 │
│ [MP条] ██████░░░░░░ 60/100 │
│ [经验] ████████████░ Lv.5 │
│ │
│ [小地图] ┌───┐ │
│ │ · │ ← 当前房间高亮 │
│ └───┘ │
│ │
│ ┌─┬─┬─┐ │
│ │Q│W│R│ 技能栏 │
│ └─┴─┴─┘ │
│ ┌───┐ │
│ │ E │ 互动键 │
│ └───┘ │
│ [灵石: 1250] [道心: 3] │
└─────────────────────────────────────────────┘
伤害数字的规则:
普通伤害:白色小字,向上飘动
暴击伤害:黄色大字,带震动效果
治疗:绿色数字,带 + 号
元素伤害:对应元素颜色,带元素图标
免疫/格挡:灰色"免疫"/"格挡"文字
致命一击:红色巨大字体,屏幕闪红
颜色和字号就是伤害的语义。 玩家在混战中不会去读数字,他读的是"那一下是黄的大字"——所以暴击必须有视觉上的独立通道,不然打出来没感觉。
角色选择界面:
┌─────────────────────────────────────────────┐
│ 选择你的轮回化身 │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │叶无尘│ │雷衍 │ │柳如烟│ │凤栖梧│ │
│ │ ★☆☆ │ │ ★★☆ │ │ 🔒 │ │ 🔒 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │寒江雪│ │墨千机│ │血无归│ │瑶光 │ │
│ │ ★☆☆ │ │ 🔒 │ │ 🔒 │ │ 🔒 │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │
│ [角色像素立绘] [属性雷达图] │
│ [技能预览] │
│ "凡间剑客,一生痴迷剑道" │
│ 流派:御剑流 / 剑舞流 / 剑魂流 │
└─────────────────────────────────────────────┘
五、技术:为什么是 Godot
选 Godot 4.x,理由是四条:开源免费、2D 支持优秀、GDScript 好上手、跨平台导出方便。备选是 Unity + 2D Pixel Art Toolkit。
对一个像素 2D 动作游戏来说,Godot 的 2D 管线是原生设计而不是从 3D 降维过来的,这一点在光照和粒子上的差别很明显。
系统架构
├── GameManager(游戏管理器)
│ ├── RunManager(轮回管理)
│ │ ├── LevelGenerator(地图生成)
│ │ ├── RoomManager(房间管理)
│ │ ├── EnemySpawner(敌人生成)
│ │ └── LootManager(掉落管理)
│ ├── PlayerManager(玩家管理)
│ │ ├── CharacterController(角色控制)
│ │ ├── SkillSystem(技能系统)
│ │ ├── InventorySystem(背包系统)
│ │ └── StatsSystem(属性系统)
│ ├── CombatManager(战斗管理)
│ │ ├── DamageCalculator(伤害计算)
│ │ ├── HitBoxManager(碰撞管理)
│ │ └── EffectManager(特效管理)
│ ├── UIManager(UI管理)
│ ├── AudioManager(音频管理)
│ └── SaveManager(存档管理)
│ ├── RunState(轮回状态 - 不存档)
│ └── PersistState(永久状态 - 存档)
存档系统的划分是整个架构里最关键的一处。 RunState 不落盘,PersistState 落盘——这条线必须一开始就划清楚,不然做到后面会出现"半途退出再进来,装备还在但地图变了"这种脏状态。
存档结构长这样:
{
"total_runs": 47,
"highest_heaven": 5,
"total_kills": 12847,
"dao_fragments": 23,
"purchased_upgrades": ["hp_1", "atk_1", "crit_1"],
"unlocked_characters": [1, 2, 5],
"achievements": ["first_boss", "no_damage_boss"],
"bestiary": {}
}
地图生成器的伪代码:
class LevelGenerator:
def generate_level(self, heaven_level: int) -> Level:
# 1. BSP 分割
rooms = self.bsp_partition(width=64, height=64, min_room=8)
# 2. 房间类型分配
for room in rooms:
room.type = self.assign_room_type(heaven_level)
# 3. 走廊连接
corridors = self.connect_rooms(rooms)
# 4. 敌人放置
for room in rooms:
if room.type == COMBAT:
room.enemies = self.spawn_enemies(room, heaven_level)
# 5. 道具放置
for room in rooms:
if room.type == TREASURE:
room.loot = self.generate_loot(heaven_level)
# 6. 主题皮肤应用
self.apply_theme(rooms, heaven_level)
return Level(rooms, corridors)
六、数值平衡参考
敌人随重天缩放(和第三篇那张表是同一组数据,这里补上玩家的成长曲线):
| 等级 | 所需经验 | 累计 |
|---|---|---|
| 1→2 | 100 | 100 |
| 2→3 | 150 | 250 |
| 3→4 | 225 | 475 |
| 4→5 | 340 | 815 |
| 5→6 | 510 | 1325 |
| … | ×1.5 递增 | … |
| 14→15 | 3875 | ~15000 |
经验是 ×1.5 递增的等比数列。这意味着升到满级需要的总经验约 15000,而前 5 级只占 1325——不到 9%。
这个设计意图是:前期快速给反馈,后期拉长节奏。玩家在头十分钟能升好几级,感受到明显的成长;到了第十重天,升一级要打很久,那时候驱动他的已经不是等级,而是 Build 的完成度。
七、DLC 规划
顺手写了个后续方向,但也只是方向:
DLC 1「第十重天 · 外域」:新增第 10 重天(外星风格)、2 个角色(星际修士、虫族女王)、30 种道具。
DLC 2「双人轮回」:双人合作模式,合作专属技能与道具,双人 Boss 变体。
免费更新「无尽模式」:通关后解锁,无限层数,难度持续提升,带排行榜。
八、写在最后:这份文档的边界在哪
五篇写完,回头看,我最想说的其实是一件文档做不到的事。
上面这些东西——320×180、32 色、闪白 1 帧、0.2 秒无敌帧、×1.5 经验曲线、6 倍血量倍率——它们全都是推断,不是结论。
我可以把机制写得很清楚:什么触发什么,什么克制什么,什么解锁什么。这部分文档确实能写明白,甚至写完之后比在脑子里想清楚多了。
但手感是写不出来的。
- 2 秒的无敌帧到底够不够?闪白 1 帧在 60Hz 屏幕上会不会看不见?BOSS 3 的柱子该多硬才刚好?「七步断肠」的 700% 是不是离谱?——这些问题的答案不在文档里,在一个真人拿起手柄、打上三十分钟之后的表情里。
这也是为什么我在第一篇里说,这份文档是一张待验证的清单。
我甚至有点怀疑,等真做出来之后,这五篇里有一半的内容会被推翻。八个角色可能砍到四个,二十四种流派可能只剩八种,九个 Boss 可能只做完五个。
但那又怎样呢。
先想清楚,再动手,然后接受想法会变形——这个过程本身比文档的准确率重要得多。
系列结束。文档版本停在 v1.0,最后更新 2026-08-25。
《九霄轮回录》—— 轮回不止,道心不灭。
评论
本站已关闭评论。

