ESC
开源 1 分钟阅读

INKWAVE:基于three.js的Splatoon风格4v4涂地对战射击游戏,浏览器直接运行、无需构建步骤

开源项目INKWAVE发布:一款Splatoon风格的4v4涂地对战射击游戏,可直接在浏览器中游玩。基于three.js r186构建,无需任何构建步骤。支持私房在线对战与机器人填充,包含7种武器和3张地图,角色、动画、贴图、音效与音乐全部由代码程序化生成,仅依赖两款字体。采用MIT许可证,与Nintendo无关。

来源:GitHub

黄金时刻的Halyard Marina

INKWAVE

一款原创的Splatoon风格4v4涂地对战射击游戏,可直接在浏览器中运行。
用墨水涂满地面,在自己的墨水中畅游,用涂地面积击败对手。

▶ 立即游玩 · 操作方式 · 在线对战 · 本地运行 · 实现原理 · 参与贡献

CI three.js r186 No build step MIT


特性

  • 涂地对战,4对4。 每场三分钟,涂地面积最多的队伍获胜。可对抗三种难度级别的机器人。
  • 与好友在线对战。 创建私人房间,分享五位字符的房间码,最多八名玩家带着装备与外观在大厅列队。空位由机器人填补;若有人中途退出,机器人会接管其鱿鱼角色继续比赛。
  • 鱿鱼形态。 按住即可潜入自己的墨水:快速游动、补充墨水槽、攀爬已涂墨水的墙壁、以海豚式跳跃越过水域缺口。
  • 七种武器,各有手感:Spritzer(射击枪)、Swell Roller(滚筒)、Glint Charger(蓄力狙击)、Popper Blaster(爆破枪)、Twinfin Dualies(双枪,可翻滚闪避)、Tidebucket Slosher(泼洒桶)和Gyre Splatling(蓄能机枪)。每套配置都配有Splat Bomb(墨水炸弹)和一个特殊武器。
  • 三张地图,白天或黄昏。 Tidewater Plaza、Kelpline Terminal和Halyard Marina——一个真实运营的游艇码头,一辆汽车渡轮横泊中央,水域缺口正是整张图的精髓所在。
  • 墨水表现得像液体。 墨渍会扩散并沉降,新鲜墨水有光泽并会干燥,墨水会沿墙壁滴落,游动时液面本身会留下尾迹。
  • 一张真正可读的地图。 按住Tab,镜头升起,变为整个战场的移轴立体模型俯视图,带有己方队伍标记和一键Super Jump(超级跳跃)。
  • 更衣柜。 定制你的鱿鱼角色:触手发型、头饰、面容、服装。
  • 一切皆为程序化生成。 角色、动画、武器、纹理、道具、音效和音乐全部由代码生成。除两款字体外没有任何下载的资源。

Tidewater Plaza 黄昏中的Kelpline Terminal

操作方式

操作键盘/鼠标手柄
移动W A S D左摇杆
瞄准鼠标右摇杆
射击鼠标左键RT
鱿鱼形态ShiftLT
跳跃/翻滚闪避空格A
副武器(炸弹)右键/ERB
特殊武器FY
地图+超级跳跃按住Tab或M,然后按1–4或点击标记View
暂停EscStart

手柄在托管版本(https)上可用。在普通的http://局域网地址下,浏览器会屏蔽Gamepad API。

在线对战

在主菜单选择Online,然后选择Create a room并将房间码发给好友(或选择Join a room并输入对方的房间码)。房主选择地图、时间段、比赛时长以及是否用机器人填补空位;其他玩家选择队伍、武器和外观并准备就绪。阵容、表情和准备状态对房间内所有人实时同步。

房间运行在一个极小的中继服务器上(一个Cloudflare Worker,每个房间对应一个Durable Object,代码位于server/)。它只转发消息:每名玩家自行模拟自己的鱿鱼角色并持续传输状态,其他人通过同一动画系统在平滑的时间轴上渲染,延迟约十分之一秒。其原理及用于测量的工具见docs/NET.md。

要在自己的网络上进行在线对战,可在游戏旁运行中继:

npm install      # 一次性:中继运行在wrangler上
npm run relay    # ws://<本机>:8787

从localhost或局域网地址打开的页面会自动使用该中继;?relay=wss://…可将其指向其他位置。

本地运行

没有构建步骤。任何静态文件服务器都可以;项目附带的服务器还能向局域网提供服务,并发送no-cache头,确保模块更新不会过期。

git clone https://github.com/jaydendavisnc/inkwave.git
cd inkwave
npm start        # http://localhost:8490

实用的URL参数:?map=halyard&time=dusk选择地图,&autostart=180跳过菜单直接进入180秒比赛,&autopilot让机器人代你操控。

npm install      # 一次性,用于无头工具
npm run check    # 对每个模块进行语法检查
npm run smoke    # 在无头Chrome中启动并进行8秒自动驾驶,出现控制台错误即失败
npm run build    # 组装dist/(游戏+仅其导入的three.js插件)

在中继运行的情况下,npm run net-test会在无头客户端之间进行一场真实比赛,并报告每个屏幕绘制的内容(见docs/NET.md)。

实现原理

  • 墨水在纹理空间中绘制。 每个可绘制面拥有一个4K图集中的一个区域;墨渍在GPU上绘制进去,同时一个粗粒度的CPU网格保持涂地得分与游戏逻辑查询同步。关卡着色器将墨水以独立的高度、光泽和湿度叠加在表面上。见src/world/paint.js和src/world/inkShading.js。
  • 地图即数据。 一张布局是竞技场半边的盒子与坡道列表;另一半是180°旋转所得,因此两队始终获得完全相同的场地。环境光遮蔽离线烘焙(tools/bake-ao.mjs)。见src/world/maps.js。
  • 角色完全程序化。 几何体、材质、60骨骼绑定和所有动画(移动、鱿鱼形态、武器姿态、次级运动)都是代码,由基于弹簧的姿态系统驱动。见docs/RIG.md。
  • 系统通过事件通信。 武器、角色和比赛发出类型化事件;特效、HUD和音频进行订阅。契约文档见docs/EVENTS.md和docs/CONTRACTS.md。
  • 确定性工具。 游戏暴露冻结/步进调试接口,使胶片帧、操作测量和机器人模拟可逐帧重现(tools/film.py、tools/measure-handling.mjs)。

渲染采用three.js r186(本地vendor,使用导入映射的普通ES模块),配合GTAO、泛光和自定义调色pass。

浏览器支持

Chrome和Edge是目标浏览器;Firefox可用。Safari可运行但较慢。High画质预设建议使用独立显卡或较新的集成显卡;设置菜单提供Medium和Low档位。

参与贡献

欢迎提交issue和pull request。请先阅读CONTRIBUTING.md了解项目结构和需要首先运行的检查。

许可证

MIT © 2026 Jayden Davis。INKWAVE是一个独立项目,与Nintendo无关联;Splatoon是Nintendo的商标。