Superpowers 这个名字我第一次看到的时候,第一反应是“某个中二气息十足的编程训练营”,第二反应才是“这怕不是个想让你拥有超能力的 IDE 吧”。等到真正上手之后,才发现它实际上是一个基于 TypeScript 的实时协作开发环境。最核心的卖点是浏览器即 IDE,打开页面就能写代码、搭场景、做 2D 游戏,而且天然支持多人同时编辑同一个项目,连编译和运行都在云端替你搞定。可以说,它是那种真正把“协作”和“低门槛”揉进骨髓里的开发工具。
这篇文章写给谁呢?想折腾 2D 游戏却又不想一上来就啃 Unity、Godot 的独立开发者,被协同开发环境整得心态爆炸的团队,以及对 TypeScript 感兴趣但不知道拿它做什么练习项目的学习者。按照我实际折腾下来的经验,从头安装到成功跑起来一个带场景、带脚本的小游戏,半小时左右就能完成。如果你已经有点 TypeScript 基础,那基本上就是无缝切入。
1. 先搞清楚 Superpowers 到底是什么
1.1 它不是一个“游戏引擎”,而是一个协作开发平台
很多人第一次接触 Superpowers 都会把它和 Godot、Unity 这类传统游戏引擎做对比。说实话,这种对比有点不太公平。传统引擎的核心是“编辑器 + 渲染管线 + 物理系统”的完整闭环,Superpowers 则更像是把这些能力全部搬进浏览器,然后围绕“实时协作”这一件事做深度定制。
它的底层是 TypeScript,意味着所有脚本都是强类型语言。而它的渲染部分跑在 WebGL 上,2D 游戏生态是它的主场。你不必本地安装庞大的编辑器,只要一台能开浏览器的设备就能参与开发。这个特性在多人协作、黑客松、课堂教学这些场景下,优势非常明显。
不过要特别提醒一句:Superpowers 从来没有把自己定位成“下一代 Unity”。如果你想做的是大型 3D 游戏、重度物理仿真,那这个工具并不合适。它的舒适区是 2D 平台跳跃、俯视角射击、解谜、类银河恶魔城以及 Web 应用原型这类项目。
1.2 实时协作是怎么做到的
Superpowers 的协作机制和 Google Docs 类似,它的服务器会同步每个协作者的操作,而不是简单地把整个文件丢来丢去。你改一行脚本,队友的界面上会实时看到你的光标在移动,甚至能直接看到你敲进去的字符。
这个机制的好处很明显:开会讨论需求时,不用再对着截图沟通了,直接拉个房间,对着同一份代码现场改。坏处也很明显,如果你的网络延迟比较高,操作会有一点点“黏滞感”,习惯本地 IDE 那种零延迟响应的同学可能需要一点适应时间。
实际体验下来,这个实时协作的稳定性比我预期要高不少。我试过三个人同时编辑同一个场景文件,一个人调精灵位置,一个人改脚本,一个人在调动画帧,整个过程没有出现互相覆盖的问题。这背后是因为它对资源采用了类似乐观锁的冲突处理策略,后面的写操作会基于最新版本做合并,基本不丢数据。
1.3 它到底能做什么
抛开“游戏引擎”这个狭隘定位,Superpowers 实际能做的事情包括但不限于:
- 2D 游戏的完整开发:平台游戏、射击游戏、卡牌游戏、解谜类都可以上车。
- 实时协作原型设计:Web 页面、交互原型、数据可视化小工具。
- 教学与编程入门:因为浏览器即可运行,学生不需要配置任何环境,打开链接就能跟着老师的节奏写代码。
我在本地用它做过一个俯视角小游戏,从地图绘制到敌人 AI 到玩家操作,全套流程走下来感觉非常顺畅。尤其是内置的场景编辑器和像素编辑器配合得很紧,画完素材直接拖进场景里调整层级就能用,省去了传统引擎里素材导入导出的折腾。
2. 安装与部署:本地跑通整个开发环境
2.1 前置依赖准备
Superpowers 的部署比我想象中要轻量。它并不需要你安装 MySQL、Redis 这类重量级中间件,只需要一个 Node.js 环境。我在 Windows 11 和 Ubuntu 22.04 上都顺利部署过,步骤大同小异。
先看 Node.js 版本。Superpowers 对 Node 的版本要求比较保守,早期版本在某些新版 Node 下会编译失败。我用的是 Node 14.x LTS,一路畅通。如果你用的 Node 版本比较新,比如 18 以上,建服务器起来通常也没问题,但编译依赖阶段偶尔会冒出一些难以排查的坑。所以,稳妥起见,装一个 Node 14 或者用 nvm 切到 14 再跑。
安装 nvm 的命令,Windows 用户可以直接用官方 installer,Linux/macOS 用户打开终端执行:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash装完 nvm 后,执行:
nvm install 14 nvm use 14确认 Node 版本无误后,进入下一步。
2.2 获取 Superpowers 源码
Superpowers 是开源项目,直接去它的官网或 GitHub 仓库把代码拉下来就行。建议用 Git 克隆:
git clone https://github.com/superpowers/superpowers.git cd superpowers这个仓库包含的内容比较多,有服务器端、客户端、各种插件。首次检出的文件量不算小,耐心等它拉完即可。接下来需要安装依赖,这个步骤是整个部署过程中最耗时也最容易出问题的环节:
npm install如果你在国内网络环境下执行,可能遇到某些依赖下载缓慢的问题。这里有个小技巧,可以临时切换到淘宝镜像源:
npm install --registry=https://registry.npmmirror.com依赖安装完成后,还需要单独构建一下:
npm run build这个构建过程会把 TypeScript 编译成 JavaScript,同时打包客户端资源。构建时间跟机器性能有关,我本地大概花了四到五分钟,期间风扇一度很卖力地工作。
2.3 启动服务器与连接客户端
构建完成后,启动服务器非常简单:
npm start默认端口是 4236。启动日志里会打印出一个地址,类似http://localhost:4236,手动访问这个地址,就能看到 Superpowers 的主界面了。
此时你可能会遇到第一个小问题:如果服务器跑在远程机器上,而你想从本地浏览器访问,记得开放对应端口的防火墙策略。我踩过的坑是云服务器安全组只开了 80 和 443,结果 4236 端口被默认拦掉了,折腾了半天才发现是防火墙的事。
还有一个更隐蔽的坑,就是服务器启动后如果显示“Superpowers server is listening on 0.0.0.0:4236”,意味着服务已经监听所有网络接口,可以直接用 IP 访问。
注意:Superpowers 默认没有配置 SSL,如果用在公网部署,建议放一层 Nginx 反向代理做 HTTPS 终结,不然浏览器里麦克风、摄像头相关的功能会受限制。
2.4 开一个项目并邀请队友
首次打开主界面时,会让你创建一个项目或者加入已有项目。创建项目的过程很像创建 Git 仓库,填一个名字即可。项目创建后,界面会自动跳转到三维场景视口。
邀请队友的方式很有意思:直接把项目 URL 发给别人,对方打开后输入自己的昵称就能进入协作。不需要注册账号,不需要设置密码。这种零门槛设计在局域网调试、课程教学场景下特别方便,但也要注意,它意味着任何人都能通过链接访问你的项目。如果要保护代码,最好只在可信网络内运行,或者用 Nginx 做一层访问认证。
我实际测试过,A 机器开一个项目,B 机器按 IP 访问,进入后立即能看到 A 的编辑器和预览画面,双方可以同时修改脚本和场景,实时同步延迟大概在几百毫秒以内。这效果跟用线上协作工具差不多了。
3. 用 Superpowers 搭建一个完整的小游戏场景
3.1 创建场景与基础物体
进入项目后,默认会有一个空场景。在左侧的资源管理栏里,可以右键新建“Scene”,也就是场景文件。双击场景文件,会在主视口打开它。
场景编辑器的操作和 Blender 有一点像,但更偏向 2D 工作流。按住鼠标中键拖动是平移视图,滚动滚轮是缩放。你想要在场景里加一个方块,可以直接从菜单栏选择“Add object”然后挑选基础形状,例如“Sprite”、或者带有刚体属性的“Physics body”。
这时候就要引入 Superpowers 的资源管理概念了。与传统引擎不同,这里面的所有东西都视为“asset”。脚本、图片、声音、场景,全部以资源的形式存放在项目面板里。你可以随时拖动一个资源到场景中,生成对应的实例。这个设计让整个项目的组织方式更统一,不必区分“场景里创建的物体”和“项目里的文件”。
3.2 创建一个带像素风的玩家角色
我曾经用 Superpowers 内置的像素编辑器(Pixel Editor)画过一个简易角色。这个像素编辑器的易用程度超出预期:左侧工具栏提供画笔、橡皮、取色器,右侧可以逐帧编辑动画。只要你有耐心,完全可以通过它画出一整套精灵图。
画完素材后,保存为 sprite asset,系统会自动生成多个方向的动画状态。然后拖进场景,一个玩家角色就立住了。
如果你不想自己画,也可以直接导入 PNG 素材。右键资源面板,选择“Import assets”,然后选择本地的图片文件即可。Superpowers 会自动把它转换成项目内可用的资产。需要注意的是,首次导入大尺寸图片时,系统会生成缩略图,这个过程在低配机器上可能会卡一下。
3.3 用脚本驱动角色移动
有了角色之后,就该写逻辑了。右键项目面板,创建一个 TypeScript 脚本资源。把脚本拖到场景里的角色实体上,就算是绑定完成了。
下面是我写的简单移动脚本,本质上就是一个标准的 TypeScript 类:
class Player extends Sup.Behavior { speed = 0.15; awake() {} update() { if (Sup.Input.isKeyDown("LEFT")) { this.actor.move(0, -this.speed); } if (Sup.Input.isKeyDown("RIGHT")) { this.actor.move(0, this.speed); } if (Sup.Input.isKeyDown("UP")) { this.actor.move(-this.speed, 0); } if (Sup.Input.isKeyDown("DOWN")) { this.actor.move(this.speed, 0); } } }这里简单解释一下:Sup.Behavior是所有脚本的基类,awake在组件初始化时调用,update在每一帧被调用。Sup.Input.isKeyDown专门用来获取键盘输入。坐标系统里,x 轴向右为正,y 轴向下为正,和 Canvas 保持一致。
写完脚本后,按播放按钮预览,角色就能在场景里走起来了。别忘了,队友此时如果也在编辑同一个场景,他会看到角色在预览视口中被你的脚本驱动,这是我在其他引擎里从未体验过的“仪式感”。
3.4 场景编辑器里不得不说的几个细节
Superpowers 的场景编辑器有一个“层(Layer)”的概念,跟我用过的 Godot 节点体系不太一样。它的层更像传统图像软件的图层,你可以把背景、碰撞体、可交互物分别放在不同层里,调整上下次序来管理遮挡关系。如果你的游戏是俯视角,比如角色站在树下面,就需要把树这一层放在角色层之上,这样角色才能被树叶遮挡。
碰撞体的设置也很直接。给实体添加 Box collider 组件,然后调整边框大小,让它大致贴合素材边缘。接下来用 Sensor 组件配合脚本做碰撞检测,就可以实现非常轻量的击杀判定。
当时我做怪物 AI 时用到了场景里的 waypoint 系统。所谓 waypoint,就是在场景里摆几个空节点,然后脚本按顺序让怪物移动过去,到达后再切换到下一个。这个方式写起来直观,回调逻辑也不容易出死循环。
4. Superpowers 的脚本系统和内置编辑器逐个拆解
4.1 TypeScript 是骨架,但别再脑补传统流程
Superpowers 官方支持的语言就是 TypeScript,没有别的选择。这点和很多游戏引擎的“多语言支持”不同,它反而让我觉得更聚焦,不需要为了“要不要写 Lua 还是 C#”争论。习惯了强类型约束之后,代码提示、重连检查、自动补全都比 JS 舒服太多。
有一点需要注意,Superpowers 并不是直接运行你的 TypeScript 代码。它先通过自己的编译器把代码转成 ES5,然后再在浏览器里执行。这意味着,你不能完全依赖最新 ECMAScript 标准的新特性,比如一些很新的 API 和语法糖在旧版 Chakra 核心下可能不认账。好在这个编译器对 TypeScript 类型系统支持得很完整,日常泛型、接口、枚举啥的都能正常用。
Superpowers 自带一套比较全面的引擎 API,分类大概是:
Sup.Input:键盘鼠标输入检测Sup.Actor:场景实体操作Sup.Math:常用数学计算Sup.Sprite:精灵渲染相关Sup.Audio:声音播放控制Sup.getActor:获取指定名字的实体
基本上,日常游戏逻辑所需的核心 API 都覆盖到位了。
4.2 像素精灵编辑器怎么用得顺手
像素精灵编辑器算得上 Superpowers 最具特色的模块。进入方式很简单,右键资源面板,新建一个“Pixel Art Tile”,双击打开。
编辑器布局类似 Aseprite 或者 Piskel,左侧是颜色板,中间是画布,右侧是图层和动画时间轴。你可以直接按帧绘制角色动作,也可以把一整张精灵图裁剪成多个帧。关键的一点是把锚点(Anchor)设置正确。锚点决定了精灵的旋转中心和缩放中心,如果你是做一个顶部视角的角色,锚点通常应该放在角色脚底的位置,否则行走时会出现漂移感。
我通常用一个颜色比较明显的图层来做“占位”,比如红色色块代表碰撞箱,蓝色色块代表显示区域,等全部调试好再合并图层。这个小习惯可以省下很多后期微调的时间。
4.3 项目里如何管资源、管版本
Superpowers 没有内置 Git 支持,也没有云同步服务。你管理资源的方式,基本就是文件夹 + 资源拖拽。不过项目目录和资源映射关系是自动生成的,文件改动后,浏览器端不会像传统引擎那样自动刷新,而是通过手动刷新快捷键或者重新加载页面来反映修改。
我的建议是每周定期把项目根目录整体打包一次,存成 zip,类似“手动存档”。因为这类实时协作工具缺少可靠的版本回滚机制,一旦有人删错了资源,很可能导致整个场景打不开。我遇到过一回,队友手滑删了一个共享材质,结果全场景渲染变成紫色,找回来花了半小时。后来我们养成了“大改之前先备份”的习惯,真香。
4.4 音频、动画、可视化编辑
除了像素精灵,Superpowers 还内置了音频、字体、地图、动画等资源类型。音频编辑器可以直接对 WAV 文件做简单的裁剪和播放率调整,适合做简单音效修改。动画资源则可以把多个精灵帧串起来,配置循环模式、帧间隔和播放次数,比在代码里手撸动画要方便得多。
如果你只想快速出一个可玩原型,完全可以在不写任何渲染代码的前提下,靠编辑器把整个地图、NPC 摆放、触发区域全都搭出来,脚本只用处理事件逻辑。这种“编辑器和代码各管一半”的工作流,对原型验证效率极高。
5. 常见问题与排查技巧实录
5.1 我踩过的 5 个坑
端口被占用导致启动失败
浏览器访问页面时,如果一片空白,或者提示“Cannot GET /”,大概率是服务器本身没起来。可以先看控制台日志,如果显示EADDRINUSE,说明端口被占了。这时候要么杀掉占用进程,要么改端口,改端口要同时改服务器配置文件里的端口号以及浏览器访问地址。
Node 版本太高导致编译失败
如果你用的是 Node 18 及以上,某些依赖可能会报错 py 脚本执行错误或者 gyp 错误。我的做法是切回 14。操作系统层面,Windows 用户请确保安装了 Visual Studio Build Tools,不然 node-gyp 会编译失败。
协作时编辑冲突
多数情况下,Superpowers 的合并不至于丢数据,但如果两个人同时拖拽同一个文件到同一个位置,可能会出现资源错位。遇到这种情况,刷新页面,然后让错过的一方重新操作一次,问题基本就解了。
预览画面卡顿
如果你的场景里放了很多高分辨率精灵,而浏览器没有开启硬件加速,预览会掉帧。可以在项目设置里把渲染质量调低,或者考虑压缩素材。
像素画边缘出现锯齿
这是非常常见的问题。主要是资源导入时没有把 texture filtering 调到 nearest。在精灵资源的设置里,找到插值模式(interpolation),切换为“Nearest”即可。如果你用的是默认值 Linear,像素风素材的边缘就会糊成马赛克,看起来非常廉价。
5.2 排查问题时的通用方法
Superpowers 有比较完善的浏览器控制台日志输出。任何脚本报错,都会在控制台里打印出具体行号和堆栈信息。遇到报错时,不用慌,先看是哪一帧出的问题,然后逐步注释代码定位。
还有一个很实用的功能就是“Smart Container”。把一些需要批量管理的资源放进去,可以直接用一个容器对象来操作。如果角色由多个子物体组成,比如身体、手臂、武器,通过 Smart Container 统一控制位置和旋转,能少写不少脚本。
5.3 性能优化的几个小技巧
脚本方面,不要在update里频繁做资源加载或者创建新对象,这会拖垮帧率。能缓存的对象尽量缓存在awake里:
class PlayerBehavior extends Sup.Behavior { private playerBody: Sup.Actor; awake() { this.playerBody = this.actor.getChild("Body"); } update() { // 这里直接用 this.playerBody } }渲染方面,场景里的静态装饰物尽量合并成一张大的图集,减少 draw call。素材导入时,如果这张图只做装饰用,完全可以关掉它的物理碰撞组件。
5.4 团队协作时的约定
因为缺少完善的权限管理,几个固定成员协作时尽量约定好文件编辑的“所有权”。比如地图资源由美术负责,代码资源由程序员负责。实时协作虽然避免了版本管理的割裂感,但如果没有这些口头约定,还是会偶尔出现互相覆盖的尴尬。
我当时和队友约定的规则就是:代码文件谁开谁改,场景文件每次只允许一个人拖拽大物件,另一个人负责调脚本参数。试跑下来,摩擦率明显下降。
6. 扩展玩法:Superpowers 还能用来干这些事
6.1 当作一份 TypeScript 教程
因为整个引擎已经提供了完善的类型定义和 API 文档,直接把官方自带的示例项目全部跑一遍,就能对 TypeScript 的类、接口、继承、泛型有一个直观的认知。我一度觉得,跟着官方示例敲完几遍,比看一本风格晦涩的 TS 书要来得扎实。
6.2 用做团队头脑风暴工具
Superpowers 的场景编辑器和脚本语言天然适合创建一系列可交互原型。例如想做一个猜谜游戏原型,不需要从头写 UI 库,直接拖几个按钮,配一点脚本就能落地。坐标、大小、层级都能实时调整,这比拿 PowerPoint 画几十页流程图要直观得多。
6.3 做成局域网内的小型协作工具
如果你搞过黑客松或者团队工作坊,就会明白所有人数次重复改一个界面带来的绝望。用 Superpowers 搭建一个内网协作空间,几个人同时连线改同一个原型,效率提升非常明显。网络结构上只需要一台可以运行 Node 的机器,然后在局域网内广播 IP 和端口即可。
7. 一些掏心窝子的经验和建议
Superpowers 确实不是一个能和主流引擎掰手腕的全能型选手,但它在“轻量协作开发”这个垂直领域,占据了一个相当特别的位置。它不需要安装,不需要配置环境,打开浏览器就能动手写代码,这种体验足以让很多被工程化折腾到怀疑人生的开发者眼前一亮。
如果你打算深入使用,有几个经验值得记下来:
第一,永远别把重要资料只存一份。Superpowers 的本地同步机制并非绝对安全,定时打 zip 备份是个好习惯。第二,遇到引擎 API 文档没有覆盖到的细节,直接翻源码。项目的依赖少,源码可读性很高,比去论坛到处碰运气更高效。第三,认真对待素材的锚点和插值设置,这两个指标决定了后续所有动画和操作的手感。第四,心态摆正,它的目标是帮助你快速构建 2D 原型和协作开发,不必用“有没有物理引擎粒子特效”这种标准去衡量它。
如果你手头有个小点子的 2D 游戏,或者只是想找个工具锻炼 TypeScript 的实战手感,Superpowers 大概率不会让你失望。尤其是当你在浏览器里打开项目、看到队友的光标在同一份代码上跳动的时候,那种“超能力”的感觉,确实不是传统本地开发环境能给的。
最后再分享一个小细节:Superpowers 的服务器端和客户端代码都是 TypeScript 写的,所以如果你对前端工程化感兴趣,花点时间读一读它的代码结构,学到的东西可能比单纯当一个用户要多得多。搞不好,你会和我一样,从一个“用户视角”慢慢变成“开发者视角”,并开始琢磨着给它写点插件了。