DraftReviewPublishedArchived

一个 AI 叙事游戏从构想到搁置的全过程

从 Telegram Bot 到 Phaser 像素风 RPG,一个独立游戏项目经历三次前端迭代、零成本美术工程、程序化地图生成,最终因定位模糊而搁置。这是完整的技术复盘。

By Joker2026/04/155 min

这个项目想做什么

烬世,一个 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 纯文字交互 ✗ 不够直观 Next.js Web 网页式 UI ✗ 像网站不像游戏 Phaser 像素风 2D RPG 体验 △ 美术成本高

第一版: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 流水线 process_assets.py 暗化废土素材 10 角色 + 4 地形 处理流程 1. 色相旋转矩阵变换 2. 亮度压低 (0.6-0.9) 3. 饱和度调节 (0.6-0.85) 4. 灰烬色调混合 (5%) 5. 保持透明通道 4 base → 10 角色变体

找到了一个优质的 CC0 素材包——完全免费、风格统一的像素风角色和地形。然后写了个 Python 脚本,用 PIL 做自动化处理:

  • 地形暗化:降低亮度和饱和度,叠加灰烬色调,让明亮的冒险风变成末世废土风
  • 角色变体:用色相旋转矩阵,从 4 个基础角色生成 10 个视觉不同的变体
  • 粒子生成:程序化生成灰烬和余烬粒子纹理

关键参数调了好几轮。第一版角色太暗了,在深色背景上几乎看不见。最后把灰烬色调从 10% 降到 5%,角色亮度提到 0.65-0.9 才达到平衡。

程序化地图生成

地图不是手工画的,是程序生成的。80×45 格的世界,5 个风格各异的区域。

第一版是五个矩形色块,难看得要命。后来用 value noise 做了有机形状:

  • 椭圆距离 + 噪声阈值:让区域边缘不规则
  • Bresenham 路径 + 随机摆动:连接区域的小路自然弯曲
  • 深度排序装饰物:树木、建筑、岩石按 y 坐标排序,有前后层次
  • 水体系统:沼泽水池、河流、海岸线

场景架构

BootScene PreloadScene MainMenuScene GameScene UIScene (并行) DialogScene (弹出)

游戏跑起来后有 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 的时候,站在地图上看着程序生成的树和房子,突然意识到一个问题:这个项目不伦不类

几个致命矛盾:

  1. 美术天花板:零成本素材能撑起 demo,但撑不起一个让人愿意花时间的游戏。要做到视觉上「好看」,需要的投入远超预期。程序化暗化只能做到「不难看」,做不到「有吸引力」。

  2. 玩法复杂度 vs 上手门槛:系统设计得很丰富——阵营、亲密度、PvP、章节制、AI 对话。但玩家第一次打开游戏,看到一个像素小人站在暗色地图上,他凭什么要花时间理解这些系统?

  3. 定位模糊:文字冒险?那不需要 Phaser。像素 RPG?那需要更好的美术和关卡设计。AI 叙事实验?那 Telegram Bot 其实就够了。每个方向都需要全力投入,但项目在三个方向之间反复横跳。

说白了:想做的太多,能做好的太少

收获了什么

虽然项目搁置了,但几个技术方向被完整验证了:

  • Python PIL 批量素材处理是真的好用。色相旋转、亮度调节、批量生成变体,以后做任何像素风项目都能直接复用这套流水线。

  • 程序化地图生成的思路(noise + 椭圆距离 + 路径雕刻)在很多 2D 游戏场景下都适用。

  • Phaser + Vite + TypeScript 这套技术栈确实顺滑。如果未来做更聚焦的小游戏,可以直接搬过来。

  • AI 叙事引擎的后端设计是可复用的。世界 tick、NPC 自主行为、动态对话生成,这套架构换个更合适的前端照样能跑。

最大的教训:独立项目最怕的不是技术难度,是方向发散。每多一个「也想做」,就多一倍的工作量和一半的完成概率。下次再做,先把核心体验钉死,其他全砍。


这篇文章记录的是一个真实项目从构想到搁置的完整过程。不是教程,不是最佳实践,就是一次诚实的复盘。如果你也在做独立游戏或者 AI 应用,希望这些弯路对你有参考价值。

QUEST COMPLETEREWARD: +30 XP, +1 LEGENDARY ITEM
Build Progress100%
无信号
PULSE
0PULSES