☰
Superpowers:浏览器里的多人实时协作开源游戏开发环境
2026/10/28 11:46:22 网站建设 项目流程

1. Superpowers:一个藏在浏览器里的“多人同屏”游戏开发环境

我说一个很多做游戏开发或创意编程的朋友没听过、但当年折腾过的人都会记住的开源项目——Superpowers。它的定位非常特别:直接让你在网页里打开编辑器,几个人同时连到同一个项目里,像写 Google 文档一样实时写游戏代码,画面、场景、资源都共享。第一次用的时候,我最大的感受是“原来游戏开发还能这么协作”。

这个项目最核心的价值不是“又多了一个游戏引擎”,而是把实时协作、Web 端开发、轻量级 HTML5 游戏三个点缝合在了一起。它既能做 2D 游戏,也能做 3D 场景,支持 JavaScript、TypeScript、Lua 和 CoffeeScript 四种脚本语言。对只想快速做原型、上课教学、或者和小伙伴在同一个局域网里动手搞点东西的人来说,安装一套 Superpowers 非常合适。

其实最早我是在一个独立游戏开发者的交流帖里看到的,当时想找一个“能多人一起写代码的 2D 游戏工具”,找了一圈才发现 Superpowers 就是干这个的。如果你有下面这些需求中的任意一个,这篇文章会很有用:

  • 想带学生或团队成员一起做一个小游戏,但不想每个人都先装一个几 GB 的引擎;
  • 想做轻量 HTML5 游戏,但又不想一上来就碰 Unity 或者 Godot 那么重的工程结构;
  • 想体验“代码实时多人同步编辑”的开发方式;
  • 或者你只是好奇:一个开源项目是怎么做到让几个人在同一台服务器上共建一个游戏项目的。

下面我会从项目架构、安装部署、上手实操到常见坑位一层层拆开讲,所有内容都是我自己实际跑过之后的操作记录和体会,可以直接照着做。

1.1 这个项目到底是什么

先给一个准确的定义:Superpowers 是一套开源的自托管协作型 HTML5 游戏开发环境。你把它装在服务器或者自己电脑上之后,会得到一个 Web 界面,团队成员只要用浏览器打开这个地址,就能进入项目开发环境。它不是一个在线教育平台,而是真正能用来做游戏的工具。

它不需要本地安装 IDE,不需要配置复杂的构建工具链,也不需要在每个人电脑上复制一份项目文件。你只需要有一个能跑 Node.js 的机器,Superpowers 会负责托管整个工程。这套东西大量使用了浏览器本身的能力,编辑器界面是网页,脚本编辑也在网页里完成,游戏预览同样在网页里渲染。也就是说,你不需要安装额外的客户端,浏览器就是你的开发工作室。

很多人在接触它之前会误以为这只是个“玩具引擎”,实际上它能做的事情不少。例如官方示例里有完整的 2D 平台跳跃游戏、射击游戏、甚至 3D 小场景。脚本系统也保留了一定自由度,不是那种拖拽积木式编程,而是正经的 TypeScript 和 Lua 代码。这对于教学场景来说很友好:让学生既能接触真实编程语法,又不被重型的引擎工程结构吓到。

1.2 和 Unity、Godot 这类引擎的区别在哪

我经常被问到一个问题:既然有 Godot 这样免费开源的引擎,为什么还要用一个看起来没那么出名的 Superpowers?我的答案是:两者的定位完全不同,Superpowers 不是替代品,而是另一种工作方式。

如果你用过 Unity 或 Godot,你会发现它们的基本工作流是“一个一个的本地工程”。每个成员在自己的电脑上装引擎、拉代码、改场景、提交版本库,然后处理冲突。Superpowers 换了一种思路:项目只存在服务器端,代码和场景数据在一个中央位置,成员通过浏览器实时编辑。这样天然就没有了“合并冲突”的烦恼,因为所有人的改动是实时同步到同一个数据模型里的。

另一个区别是体积和启动速度。Unity 和 Godot 的编辑器动辄几百 MB 甚至上 GB,而 Superpowers 的服务器启动之后,打开的网页编辑器加载很快,整个工具链非常轻。我记得我拿一台比较老的笔记本跑,依然能顺畅编辑 2D 场景,这一点对配置一般的教学机房特别友好。

当然,它也有明显的边界。Superpowers 目前更适合 2D 游戏和轻量 3D 场景,如果你需要做重度 3D 项目、物理模拟非常复杂的商业游戏,那显然不是它的主场。它是“快速协作和原型验证”的工具,而不是“全平台大型商业游戏发布管线”。想清楚这个定位,你才不会用错工具。

1.3 哪些人最适合装一套

按照我实际使用的经验,下面三类人最值得花时间尝试:

第一类是游戏开发教学者。带学生做项目时,最大的难题不是讲代码,而是管理几十个学生的本地环境。用 Superpowers 只需要一台服务器,所有人的浏览器访问同一个地址即可。老师在编辑器里写一段示例代码,学生那边立刻能看到,这种“实时演示”的体验非常直观。

第二类是独立小团队。两三个人想快速做一个小游戏验证玩法,又不想花大量精力在仓库管理和合并冲突上。Superpowers 的协作方式能让你们把所有时间花在游戏本身,而不是配置上。

第三类是创意编程爱好者。如果你想尝试给朋友做一个网页小游戏,或者想在一个有意思的编辑器里学 TypeScript,它也非常合适。门槛低、反馈快,打开浏览器就能看到结果。

如果你属于这几类,我建议你直接按下面的步骤安装起来,不用纠结太多。

2. 安装前先搞懂它的三层结构:客户端、服务器、网页编辑器

我第一次安装的时候吃了不少亏,因为没有先理解它的架构,导致端口、进程、项目数据傻傻分不清楚。这里我先花点篇幅把结构讲明白,后面操作就顺了。

2.1 Electron 壳、superpowers 服务、项目数据之间是什么关系

Superpowers 实际上由几个部分组成。最外层是你启动的程序,官方提供两种形式:

  • 一种是Electron 桌面客户端,你打开它之后,它会自动启动一个本地的 superpowers 服务,并弹出一个浏览器窗口连接到这个服务;
  • 另一种是Node.js 全局包,你在命令行运行superpowers,它会直接启动服务,然后用系统默认浏览器打开。

关键点是:真正干活的是一个跑在 Node.js 上的服务进程,桌面客户端只是它的启动器。这个服务负责:

  • 管理项目和账号;
  • 保存所有项目数据;
  • 提供网页编辑器页面;
  • 处理多人实时协作的数据同步。

数据默认保存在服务端的数据目录里,不会散落在每个成员的电脑上。这跟传统“本地工程”完全不一样。所以你在理解这套系统时,可以把它的服务器当成“一个包含项目文件和协作逻辑的云端大脑”,而浏览器窗口只是大脑的外接屏幕。

2.2 环境准备与版本选择

我实际测试时使用的环境是 Windows 和 Ubuntu 两种,都可以顺利跑起来。官方一直强调需要 Node.js,这里我建议不要使用太老的版本。让我给你一个比较稳妥的版本区间:Node.js 12 到 18 的 LTS 版本我都跑过,没有遇到致命问题;如果你用的 Node 版本特别新,比如 20 以上,可能会出现某些依赖编译的兼容性提示,但通常也不影响启动。

安装之前你只要准备这几样东西:

  • Node.js(自带 npm);
  • 一台能联网的电脑(如果是多人协作,最好在同一个局域网内,或者服务器有公网地址);
  • 一个现代浏览器,我推荐 Chrome 或 Edge。

你不用安装任何数据库,也不用另配 Redis。Superpowers 自带了一套数据存储机制,项目文件以 JSON 等形式保存在服务端目录里。这一点对新手来说是个很大的减负。

2.3 两种安装路线对比

我把两种方式列个表格,方便你根据自己的情况选:

安装方式适用场景优点缺点
Electron 客户端单人本机快速体验安装后双击即可,体验接近桌面软件跨平台分发麻烦,服务器端配置能力弱
npm 全局包服务器部署、多人协作、后续自托管一条命令装完,方便配合守护进程和反向代理需要命令行操作,首次启动有一点学习成本

我的建议是:如果你只是想自己先玩玩,用 Electron 客户端最省事;如果你想长期在局域网里或公网环境分享给团队用,直接装 npm 全局包。我后面的实操步骤以 npm 方式为主,因为这也是更多人问到的场景。

3. 从零安装到跑起来:npm 一条命令之外的真实操作

安装其实很简单,但“安装完能正常使用”会遇到几个容易忽略的细节。我把自己跑通的过程完整写一遍。

3.1 本机安装:npm 全局包的完整流程

选择一台干净的机器,先确认 Node 环境没问题:

node -v npm -v

没问题之后,执行全局安装:

npm install -g superpowers

这里有个小提醒:不要用 sudo 安装全局 npm 包,除非你很清楚权限问题。如果遇到权限错误,优先考虑修改 npm 的全局目录配置,而不是直接 sudo。我自己在 Ubuntu 上遇到的这类问题比较多,后来配置了用户级全局目录才消停。

安装完成后,执行:

superpowers

看到一行类似“Superpowers server listening on http://localhost:4237”的提示,就说明服务起来了。然后浏览器会自动打开登录初始化页面。

如果你在服务器上跑,可能没有浏览器。不要紧,你只要记住默认端口是4237,在本地随便找一台能访问这台服务器的机器,浏览器打开http://服务器IP:4237就可以了。

3.2 局域网协作部署:让同事/室友也能连进来

实际协作时,你得让同一局域网里的其他人也访问到你的服务。这里有一个非常关键的点,也是我踩过的坑:superpowers 默认可能只监听 localhost。如果你启动后,其他机器访问http://你的IP:4237打不开,多半就是监听地址问题。

当时我的处理方式是先看看服务监听的地址:

netstat -tlnp | grep 4237

如果是127.0.0.1:4237,那说明外部访问不到。解决办法不一定每个版本都一样,我查到的常见做法是检查配置文件里有没有 host 相关设置,或者在启动参数里指定监听地址。如果你也遇到同样问题,最简单的验证手段是先在本机访问http://localhost:4237判断服务是否正常,再排查防火墙和监听地址。这一步一定不要漏,否则你很容易以为安装失败。

另外就是防火墙。Windows 上第一次启动时可能会弹防火墙权限提醒,要允许 Node.js 通过专用网络;Linux 上如果开了 ufw,需要放行 4237 端口:

sudo ufw allow 4237/tcp

有一个经验可以先告诉你:先把防火墙放行,再排查监听地址,最后再看浏览器访问。按这个顺序排查,基本上能解决 90% 的局域网访问问题。

3.3 首次启动后的项目初始化步骤

第一次打开页面时,你会看到一个初始化引导界面。需要先创建管理员账号,然后创建一个“服务器实例”。

这里的“服务器实例”不是指物理服务器,而是 Superpowers 中的数据组织单元。你可以同时创建多个服务器实例,每个实例下面再创建不同的游戏项目,彼此数据隔离。我一般按团队或课程班次来划分。

创建流程大致如下:

  1. 设置管理员邮箱和密码;
  2. 给你的服务器实例起个名字,例如“Team Game Lab”;
  3. 确认端口和本机访问地址;
  4. 完成初始化,进入服务器配置页。

进入之后,你会看到“创建项目”按钮。Superpowers 的项目模板默认包含基本场景,创建完成后会生成一个项目入口。点击项目,浏览器就会进入编辑器主界面。

到这一步,安装层面的工作就算完成了。很多人在网上搜“superpowers 安装”之后卡在这一步,其实就是没搞明白“先建服务器实例,再建项目”这个层级关系。

4. 上手实操:创建一个带角色的 2D 小场景

安装完之后,真正上手才是关键。我带大家做一个小项目:创建一个 2D 场景,添加一个方块角色,再用脚本让它可以被键盘控制移动。这个过程会覆盖最重要的几个操作点:资源管理、场景编辑、组件绑定、脚本编写。

4.1 编辑器界面速览

打开项目后,你会看到 Superpowers 编辑器的整体布局。这一套界面和传统游戏编辑器很像,但因为它运行在浏览器里,所以按钮风格更网页化。左侧是资源和项目树,中间是 3D/2D 场景视图,右侧是属性和层级面板,下方通常是控制台和脚本编辑器区域。

我第一次进入的时候,最先找的是“保存”按钮,结果发现这套系统基本不需要手动保存。因为所有改动都会实时同步到服务器,你编辑场景里的位置、大小,或者改脚本代码,其他人立刻就能看到,数据也在后台自动持久化。这一点你需要花一点时间适应,但适应之后就会觉得很省心。

如果你之前用过 Unity,可以这么理解:场景视图是 Scene 视图,层级面板是 Hierarchy,资源树是 Project 窗口。只不过这里所有窗口都在同一个页面上,可以自由拖拽。

4.2 用脚本让角色动起来

我先在场景里创建一个 2D 对象。在资源树里新建一个 Sprite,给它选一张简单的贴图,或者直接用一个纯色方块。然后把方块拖进场景里。

接下来新建一个脚本。在资源树右键选择新建脚本,Superpowers 会给你几种语言选项,我一般选 TypeScript,因为它有类型提示,写起来更不容易犯错。脚本创建完成后,把它绑定到场景里的方块角色上。

脚本里写一个最基础的移动逻辑:

let speed = 5; export function update() { if (input.isKeyDown("ArrowLeft")) { this.entity.position.x -= speed * time.deltaTime; } if (input.isKeyDown("ArrowRight")) { this.entity.position.x += speed * time.deltaTime; } if (input.isKeyDown("ArrowUp")) { this.entity.position.y += speed * time.deltaTime; } if (input.isKeyDown("ArrowDown")) { this.entity.position.y -= speed * time.deltaTime; } }

这里用到的input、time.deltaTime都是 Superpowers 内置 API,你不需要额外引入模块。写完代码后直接切到预览模式,发现按键就能控制方块移动了。

有一个细节新手容易忽略:脚本里的实体作用域。this.entity指向的是脚本所绑定的那个实体。如果你把脚本绑定到一个空物体上,那么修改的就是空物体的坐标,而不是你看到贴图的那个角色。我刚开始做的时候,把脚本绑定错了层级,结果改了老半天坐标都没反应,后来才发现是绑定对象选错了。

4.3 实时协作功能到底怎么用

现在重点来了,这是 Superpowers 最吸引人的地方。它的协作机制允许几个人同时进入同一个项目,大家操作的实体、代码、资源全部实时同步。

具体用的时候,你只需要让另外一个人也用浏览器打开同样的项目地址。这个地址是唯一的,在服务器项目列表页可以看到。对方打开后,你们会看到彼此的光标位置和当前操作的对象。重点是,没有锁机制,也就是说你们可以同时改同一个脚本文件,Superpowers 会自动合并文本差异。我在教学时试过让两个学生同时写同一个移动脚本,一边写一部分,最终都能合并成一个能跑的代码。

多人协作时有一个体验上的微妙之处:因为所有人都能看到彼此的光标和编辑动作,沟通效率变得很高。以前用 Git 的时候,你需要等对方提交、拉取、解决冲突;在这里,你甚至可以直接说一句“你改上面几行,我改下面几行”,然后两边同时动手,马上就同步。这个体验对团队来说确实有冲击力。

如果你只是一个人开发,协作功能不会打扰你。它只是一个默认开启的底层能力,你完全可以当它不存在。但一旦你试过两个人同时用一个项目编辑器,就很难再回去用传统的方式了。

5. 常见问题速查与避坑心得

最后这部分是我按照实际踩坑经历整理的,目标是让你避开那些“没人告诉你但迟早会遇到”的问题。

5.1 高频问题与排查思路

我把遇到过的典型问题整理成一张表,方便你快速定位。

现象可能原因排查思路
浏览器打开 localhost:4237 无法访问服务没启动或端口被占用先执行superpowers看启动日志;再用netstat -tlnp | grep 4237检查端口占用
其他电脑访问不了,本机能访问防火墙未放行或监听地址不对先放行 4237 端口,再用curl http://127.0.0.1:4237确认服务;最后查监听地址
项目创建后打开一直转圈浏览器兼容问题或缓存太旧换 Chrome/Edge 试试,清缓存,关掉部分浏览器插件
脚本中有中文注释显示乱码编码问题文件编码保持 UTF-8,避免使用某些旧编辑器保存为 GBK
多人同时编辑时,代码被覆盖一节手动刷新页面导致状态落后协作时不要频繁刷新页面,以实时接收的同步结果为准;重大改动前口头沟通

引用块提示一个重点:遇到端口占用的频率比想象中高。有时候你之前启动过没有正确关闭,进程还挂在后台,第二次再执行superpowers就会提示端口被占用。Linux 下我一般用lsof -i:4237找到进程并结束它,然后再启动。Windows 下可以用netstat -ano | findstr 4237找到 PID,再用任务管理器结束。

5.2 长期使用的几点优化建议

如果你确定要把 Superpowers 作为一个持续使用的协作工具,我有几个建议。

第一,定期备份数据目录。虽然系统会自动存储,但数据目录里积累了大量项目文件,一旦服务器磁盘损坏或者误删目录,损失会非常大。我的做法是写一个简单的定时同步脚本,每天把数据目录同步到另一个备份盘。不要等到出了问题才后悔,这台服务器就是你们团队的“代码心脏”。

第二,固定端口并做反向代理。默认端口 4237 是可以直接用的,但如果你打算让更多人访问,或者和现有 Web 服务共用一台机器,可以用 Nginx 做一层反向代理,把路径转发到本机的 4237 端口。这样你可以用标准的 80/443 端口对外提供服务,也方便后续加 HTTPS。就是别忘了 WebSocket 协议跨域的问题,我当时部署的时候还专门配了一段:

location / { proxy_pass http://127.0.0.1:4237; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }

第三,不要盲目追求最新版本。Superpowers 项目本身的更新并不像商业软件那么频繁,我个人的经验是一直停留在某一个经过验证的版本上,能跑就一直用,不会为了“最新版”去折腾。这类开源项目,稳定跑通往往比追新更重要。

最后再分享一个小技巧:如果你计划在课堂上使用,可以提前准备好一个项目模板,把常用资源、脚本框架、示例场景都放进去。每次开新课直接复制项目,学生一进来就能看到标准格式,免去了大量重复配置。这个办法我在几次实操下来确实省了不少时间,比每次让学生从零初始化要高效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询