
INKWAVE
一款原创的Splatoon风格4v4涂地对战射击游戏,可直接在浏览器中运行。
用墨水涂满地面,在自己的墨水中畅游,用涂地面积击败对手。
▶ 立即游玩 · 操作方式 · 在线对战 · 本地运行 · 实现原理 · 参与贡献
特性
- 涂地对战,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(超级跳跃)。
- 更衣柜。 定制你的鱿鱼角色:触手发型、头饰、面容、服装。
- 一切皆为程序化生成。 角色、动画、武器、纹理、道具、音效和音乐全部由代码生成。除两款字体外没有任何下载的资源。

操作方式
| 操作 | 键盘/鼠标 | 手柄 |
|---|---|---|
| 移动 | W A S D | 左摇杆 |
| 瞄准 | 鼠标 | 右摇杆 |
| 射击 | 鼠标左键 | RT |
| 鱿鱼形态 | Shift | LT |
| 跳跃/翻滚闪避 | 空格 | A |
| 副武器(炸弹) | 右键/E | RB |
| 特殊武器 | F | Y |
| 地图+超级跳跃 | 按住Tab或M,然后按1–4或点击标记 | View |
| 暂停 | Esc | Start |
手柄在托管版本(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的商标。