一个 AI 叙事游戏从构想到搁置的全过程
从 Telegram Bot 到 Phaser 像素风 RPG,一个独立游戏项目经历三次前端迭代、零成本美术工程、程序化地图生成,最终因定位模糊而搁置。这是完整的技术复盘。
这个项目想做什么
烬世,一个 AI 驱动的持续性多人叙事 RPG。
核心设想:玩家进入一个末世废土世界,所有 NPC 由 AI 驱动,对话不是预设脚本而是实时生成。世界每两小时 tick 一次,NPC 会自己行动、结盟、背叛。玩家之间可以交易、偷窃、当间谍。每 7 天一个章节,4 章一轮,像一部可以玩的连续剧。
听起来很酷对吧?问题是怎么把它做出来。
后端先行:FastAPI + AI 引擎
后端是最先成型的部分,也是整个项目里最扎实的一块:
- FastAPI 跑在 8000 端口,PostgreSQL 存世界状态,Redis 做缓存
- Telegram Bot 做第一版交互入口,polling 模式
- AI 引擎:主力大模型 + OpenAI fallback
- APScheduler 每两小时触发世界 tick
- 5 个区域、5 个阵营、7+ 个 NPC、3 种玩家身份
- 全程中英双语
这套东西跑起来是能跑的,AI 生成的对话质量也可以。但问题来了——前端怎么办?
三次前端迭代
这是整个项目最折腾的部分。
第一版:Telegram Bot
最简单的方案。用户在 Telegram 里发消息,Bot 返回 AI 生成的叙事文本和选项按钮。
优点是开发成本极低,缺点是体验太文字冒险了。没有视觉反馈,没有空间感,玩家很难对这个「世界」产生沉浸感。
第二版:Next.js 网页
想做一个有地图、有角色卡、有对话面板的网页版。用 Next.js + TailwindCSS,部署到 Vercel。
做出来之后发现——这东西看起来就是个网站,不是游戏。再怎么加动效、加插画,骨子里还是 div 和 flex 布局。用户打开的第一感觉是「这是个管理后台吧」,不是「我要去冒险」。
果断放弃。
第三版:Phaser 像素风 RPG
最终选了 Phaser——最成熟的 HTML5 游戏框架。配合 Vite + TypeScript,开发体验很流畅(341ms 冷启动,357KB gzip 产物)。
这个方向是对的:像素风天然适合独立游戏,Phaser 的 tilemap、物理引擎、场景系统都很完善。
零成本美术工程
独立开发最头疼的就是美术。请画师?预算不够。用 AI 生图?风格不统一。
最终方案:CC0 开源素材 + Python 自动化处理。
找到了一个优质的 CC0 素材包——完全免费、风格统一的像素风角色和地形。然后写了个 Python 脚本,用 PIL 做自动化处理:
- 地形暗化:降低亮度和饱和度,叠加灰烬色调,让明亮的冒险风变成末世废土风
- 角色变体:用色相旋转矩阵,从 4 个基础角色生成 10 个视觉不同的变体
- 粒子生成:程序化生成灰烬和余烬粒子纹理
关键参数调了好几轮。第一版角色太暗了,在深色背景上几乎看不见。最后把灰烬色调从 10% 降到 5%,角色亮度提到 0.65-0.9 才达到平衡。
程序化地图生成
地图不是手工画的,是程序生成的。80×45 格的世界,5 个风格各异的区域。
第一版是五个矩形色块,难看得要命。后来用 value noise 做了有机形状:
- 椭圆距离 + 噪声阈值:让区域边缘不规则
- Bresenham 路径 + 随机摆动:连接区域的小路自然弯曲
- 深度排序装饰物:树木、建筑、岩石按 y 坐标排序,有前后层次
- 水体系统:沼泽水池、河流、海岸线
场景架构
游戏跑起来后有 6 个 Scene:
- BootScene:生成粒子纹理等程序化资源
- PreloadScene:加载所有真实素材(10 个角色 spritesheet、地形 tileset、4 首 BGM)
- MainMenuScene:主菜单,灰烬粒子背景
- GameScene:核心世界——tilemap 地形、装饰物、NPC(带闲置动画和交互提示)、玩家移动
- UIScene:HUD 叠加层——区域名、天数、行动点、紧张度
- DialogScene:NPC 对话弹窗,打字机效果 + 选项分支
做到了什么程度
| 里程碑 | 内容 | 状态 |
|---|---|---|
| M0.1 | 项目骨架 + 程序化占位符 | ✅ 完成 |
| M0.2 | 真实素材整合(角色/地形/BGM) | ✅ 完成 |
| M0.3 | 程序化地图 + 有机区域 + 装饰物 | ✅ 完成 |
| M1.0 | 前后端联调 + AI 对话 | ⏸ 搁置 |
| M2.0 | 多人系统 + PvP | ⏸ 搁置 |
技术验证全部通过:Vite 热更新流畅,357KB 产物体积可控,Phaser 的 tilemap 和物理引擎工作正常,Python 素材流水线可以批量出活。
为什么停下来
做到 M0.3 的时候,站在地图上看着程序生成的树和房子,突然意识到一个问题:这个项目不伦不类。
几个致命矛盾:
-
美术天花板:零成本素材能撑起 demo,但撑不起一个让人愿意花时间的游戏。要做到视觉上「好看」,需要的投入远超预期。程序化暗化只能做到「不难看」,做不到「有吸引力」。
-
玩法复杂度 vs 上手门槛:系统设计得很丰富——阵营、亲密度、PvP、章节制、AI 对话。但玩家第一次打开游戏,看到一个像素小人站在暗色地图上,他凭什么要花时间理解这些系统?
-
定位模糊:文字冒险?那不需要 Phaser。像素 RPG?那需要更好的美术和关卡设计。AI 叙事实验?那 Telegram Bot 其实就够了。每个方向都需要全力投入,但项目在三个方向之间反复横跳。
说白了:想做的太多,能做好的太少。
收获了什么
虽然项目搁置了,但几个技术方向被完整验证了:
-
Python PIL 批量素材处理是真的好用。色相旋转、亮度调节、批量生成变体,以后做任何像素风项目都能直接复用这套流水线。
-
程序化地图生成的思路(noise + 椭圆距离 + 路径雕刻)在很多 2D 游戏场景下都适用。
-
Phaser + Vite + TypeScript 这套技术栈确实顺滑。如果未来做更聚焦的小游戏,可以直接搬过来。
-
AI 叙事引擎的后端设计是可复用的。世界 tick、NPC 自主行为、动态对话生成,这套架构换个更合适的前端照样能跑。
最大的教训:独立项目最怕的不是技术难度,是方向发散。每多一个「也想做」,就多一倍的工作量和一半的完成概率。下次再做,先把核心体验钉死,其他全砍。
这篇文章记录的是一个真实项目从构想到搁置的完整过程。不是教程,不是最佳实践,就是一次诚实的复盘。如果你也在做独立游戏或者 AI 应用,希望这些弯路对你有参考价值。