← 全部作品

Work — 2026-06

Excalibur 誓约之剑

俯视角自动射击:你只管走位,攻击自己发生,一波一波打下去。

进行中可试玩Pixi.jsWebGL战争迷雾对象池配置驱动

点一下画面开始。WASD 移动,攻击自动发生;中间有升级三选一、宝箱和武器拾取。

俯视角自动射击。你只控制移动,攻击是自动的 —— 于是注意力全落在走位上:贴多远、绕哪边、什么时候冲刺。

怎么长出来的

18 次提交,集中在 2026 年 6 月 13 日到 17 日五天里

  • 06-13 核心玩法:项目初始化当天就把玩法主体跑通了 —— 竞技场、敌人、武器、玩家冲刺。同一天还塞进了炸弹敌人和战争迷雾
  • 06-13 剑的渲染改造:把剑从图形改成精灵渲染,顺手优化了竞技场地面
  • 06-14 性能:专门一轮「减少不必要重绘」,加上新敌人、火把光照与灰尘特效
  • 06-15 波次系统:把刷怪改成配置驱动,这是后面所有内容扩展的地基
  • 06-16 音频系统:一套完整音效 + BGM,随后又清理旧资源重构了一遍
  • 06-17 内容收尾:武器拾取场景、移动端拾取按钮、大规模平衡性调整,最后重构精英/boss 系统、加入模仿怪

五天里它从“能跑”长到“有节奏、有光影、有音效、有 boss”。它没有 README,也没有任何测试 —— 这一块是空着的,我不替它补。

和主线的结合点

说清楚:它不在这条线上。

我的主线是「探索面向 AI 的交互边界」。这个作品里没有 AI,也没有“可继续编辑的结构”——它压根不是那个方向上的探针。按三条判据量,它是零增量

它在这个站上有两个理由,都不是把它硬说成 AI 项目:

一、它是全站唯一一个纯“好玩”的东西。 品牌里有一条:信息区要好玩、能整活。前三件作品多少都要你先理解一点背景;这一件打开就能上手,不需要任何铺垫。

二、它的“自己动”是另一种。 波次自己推进、敌人自己刷、升级自己弹窗、掉落自己生成 —— 这是一个有自己节奏的系统

⚠️ 但这里要划清:这跟判据里的「能主动发起」不是一回事。那一条说的是 AI 自己看见值得做的事、然后对人开口;这里说的是游戏循环按规则推进。两者不能混写,我特意写这一段就是为了不让人误读。

所以它在判据上是零增量,我如实标出来。它补的是另一条线:好玩。

难点

战争迷雾要每帧重算。 视野里每一格的明暗都跟着玩家走,所以每帧都得重画一遍。全图网格是 22500 格,逐格算距离和透明度,帧率直接掉下去。

高频对象会抖。 子弹、敌人、经验宝石、掉落物,全是每秒生灭几十次的东西。直接 new 出来的话 GC 会周期性停顿,表现就是帧率忽高忽低——不是一直卡,而是突然一顿,这种最难受。

它的 Service Worker 有个陷阱(我引入时才发现的)。 sw.js 是 cache-first,而缓存名 brotato-pixi-v1 是写死的、sw.js 自身又是静态文件不会随构建改变。于是缓存的 index.html 会永远指向旧构建的资源哈希 —— 重建一次,游戏就再也打不开,而且不会自愈

修法是一行:被 iframe 嵌入时不注册 SW(独立打开时照旧注册)。已验证:嵌入时没有 service_worker 目标,直接打开时正常注册。

亮点

战争迷雾只算该算的格子。 从玩家位置出发,只遍历视野半径覆盖的那些格(代码注释里写着:22500 → 约 3800 格,-83%),再叠加格子级的快速距离剔除,范围外的格子直接整块涂黑而不是逐像素算。

手写对象池。 子弹和敌人走 ObjectPoolpop 复用、push 归还,池内数量暴露成 poolCount 可以直接观测。目的就是消灭上面那个“忽高忽低”。

内容全靠配置表。 波次、敌人类型、武器、道具、套装加成分别在 data/waves.js 里声明式定义;超出配置的波次自动回落用最后一波。加一种敌人只要加一条配置,不用碰调度逻辑 —— 这也是它最后一天还能重构 boss 系统的前提。

零运行时依赖。 dependencies 是空的,唯一的 Pixi 挂在 devDependencies 里,构建期打进产物。所以它是一个纯静态目录,扔到任何地方都能跑。