发条巨城

📄 约 2,818 字 · ⏱ 大约 8 分钟

发条巨城

原创网页蒸汽机械射击游戏 · 8 把枪 / 4 张大地图 / 3 档难度 · 零 CDN · 免下载 · 断网也能玩

👉 进入发条巨城 →

巨城「铜枢」的中央飞轮重新转动的第二天,城里的哨戒单元全部失控了。你是最后一名录事匠,同伴是哨戒单元「老铜」。带上军械库里的枪,跑遍四片厂区,守住中央飞轮,撑过 5 波清剿。

画面是自己写的 Canvas 伪 3D(透视投影 + 画家算法),没有任何外部库、没有 CDN、没有构建工具,解压就能跑。界面主色取自站点绿 #16a34a:墨绿网格底 + 米白纸张 + 翠绿强调 + 黄铜金,砖红只留给敌人和危险提示。


一、四条硬规则

规则 说明
方向永远不反 W 前进、A 左、S 后、D 右,方向键等价备用。无论哪个视角,移动都按「角色自己的朝向」算,与镜头方向完全解耦。这条写成了不带相机参数的纯函数,并有自动断言盯着。
三种人称都能切 Tab 循环:第一人称(眼位)、第二人称(镜头挂在老铜的眼上,看着自己开枪)、第三人称(背后跟随)。第二人称时画面里会多一条绿色瞄准线,因为屏幕中心不再是枪口方向。
不抄 Minecraft 没有方块体素、没有挖矿破坏、没有合成表、没有生存血条。世界是连续坐标上的机械零件与掩体,核心循环是「瞄准 → 射击 → 命中判定 → 经济 → 剧情」。
真能玩,不是壳 每发子弹都是一条射线,逐个跟敌人的身体球、头部球、掩体盒子求交取最近。打空就是打空,掩体真的挡弹,爆头真的翻倍,远距离还有伤害衰减。

二、操作与手感

按键 作用
W A S D / 方向键 前进 / 左 / 后 / 右(带加速度与摩擦,起步急停都有重量)
Shift / Ctrl 冲刺(快、散布变大)/ 静步(慢、更准、脚步更轻)
Q E 原地左右转身(第二人称靠它调整射击方向)
鼠标移动 转视角;点一下画布会尝试锁定指针,锁定失败时按住右键拖拽也能转
左键 / 空格 开火;连发枪按住不放
右键(按住) 机瞄:视野拉近(每把枪倍率不同)、散布收窄到 42%、灵敏度降低、枪归到屏幕中央
R 换弹(有进度条与下沉动作)
1 ~ 8 切换已拥有的枪
Tab 切换第一 / 第二 / 第三人称
B 波间打开商店
Esc 暂停
H 帮助

开火有镜头上抬 + 水平抖动 + 屏幕震动 + 枪口火焰 + 弹壳声,狙击枪抬得最狠,压枪是真人要练的。命中会跳伤害数字(爆头是金色大字)、准星命中标记、敌人受击硬直;击杀会炸出铜屑碎片、记录连杀(3 秒内连续击杀),三连杀起有额外音效和冲击帧。

设置里可以分别关掉震动、头部摆动、伤害数字和雷达,机瞄灵敏度也单独可调。


三、4 张大地图

场地从原来的 18×18 扩到 24×24 ~ 30×30,而且一局 5 波会自动轮换地图,不用重开就能把四张都玩到;波间还能手动「换地图」。主菜单右侧卡片可以预览地图布局、选地图池、切难度。

地图 尺寸 特点
第七盐田 28×28 开阔盐滩、木箱与栈桥、远山与红屋。适合步枪和狙击,掩体少别站着不动。
铜枢车站 30×30 两条铁轨、月台、车厢与顶棚立柱。长廊适合卡点,月台箱子能挡正面火力。
齿轮广场 26×26 12 根黄铜柱围成环形柱廊,中央就是大飞轮。绕柱打游击,中心最危险也最值钱。
废炉深井 24×24 高墙走廊 + 中央熔炉,视线短、转角多。霰弹和冲锋枪的主场。

每张地图有自己的配色、地面条纹、装饰物、固定掩体布局和 8~10 个敌人出生点,不是同一张图换个名字。

三档难度:学徒(敌人少、血薄、伤害低)/ 工头(标准)/ 老盐(更多更硬更快,但盐晶收益 +45%)。难度会影响刷怪数量、血量、速度、伤害和掉落。

六边形雷达:HUD 左上角实时显示场地边界、掩体、中央飞轮、老铜、所有敌人和自己的朝向三角——大地图不会迷路。


四、8 把枪

枪 种类 弹匣 伤害 特点 价格
盐钉 手枪 8 36 初始配枪,慢但准 0
乌嘴 左轮 6 52 爆头额外 ×1.35 1,400
刮板 冲锋枪 30 15 全自动,射速快 1,600
闸门 霰弹枪 5 15×6 一次六条射线 2,400
卤线 步枪 20 27 中距离最稳,全自动 3,200
翻面 双管 2 22×10 十弹齐发,转角杀手 3,800
墨版 轻机枪 60 13 弹链压制,后坐力要压住 4,200
正午 狙击枪 5 110 机瞄 2.6×,爆头 ×1.5,一发一个 5,600

每把枪都有独立的 SVG 剪影、射速、弹匣、备弹、散布、后坐力、换弹时间、机瞄倍率与爆头加成。8 个挂坠也都有真实数值:爆头伤害、换弹速度、盐晶收益、减伤、弹匣容量、移动速度、散布收缩。6 种印花真的换准星样式,商店买、设置里选。

命中判定

  • 枪口 = 角色眼位稍前方;方向 = 角色朝向 + 抬头角,与相机无关。
  • 敌人身体是半径 0.44 的球(中心高 0.88),头是半径 0.27 的球(中心高 1.52)。要爆头得稍微抬准星。
  • 掩体是轴对齐盒子,射线先撞到掩体就到此为止;玩家自己买的木箱挨几发会碎。
  • 散布受机瞄 / 静步 / 冲刺 / 移动 / 挂坠共同影响,霰弹枪每条弹丸独立散布;12 米外开始伤害衰减,最多掉 35%。

五、主菜单 / 设置 / 外观

  • 主菜单:竖排菜单(对战 / 训练场 / 军械库 / 商店 / 生涯 / 设置)+ 门框里的第三人称背影 + 右侧地图池卡片(缩略图、左右切换、三档难度)+ 砖红→翠绿的「开始行动」按钮。
  • 设置五页:画面(皮革缝线 + 金边舷窗「旧/新」、宽高比、渲染倍率、灵敏度、画面辅助开关)、色彩(10 段灰阶、网点圆阵、5 个色觉色块、10 段描边粗细、右侧打样)、声音(俯视同心圆雷达 + 四路音量)、键位(木质键帽 + 倾斜的纸 + 胶带,点键帽就能改)、准星(6 种样式 + 5 种颜色 + 大预览)。每一项都真的生效,不是贴图。
  • 暂停 → 外观:开火特效 / 击杀信息 / 换枪动作 / 击杀硬币 / 冲击帧五组选项网格,分别改枪口火星、击杀播报、切枪提示与音效、碎片粒子数量、击杀瞬间画面反馈。
  • 顶栏:地图名、当前波次、本局计时、五个波次点位、连杀提示。
  • 结算:《盐场日报》号外版式——大字标题、竖排战况表、MVP 人物剪影、印章、网格底纹。

六、剧情

主线首章《点火之后》 共 5 步:读完简报 → 训练场打碎 3 个靶 → 累计击杀 6 个 → 打出 3 次爆头 → 完成第 3 波且存活。

三条支线:《一尘不染》(无伤清完一波)、《另一种眼睛》(第二人称击杀 3 个)、《走遍铜枢》(在 3 张不同地图各清空一波)。

任务状态机是纯函数 reduce(state, snapshot, event),快照只读击杀数、爆头数、波次、血量、清波地图等真实数据,不存在「改个变量就弹完成」。


七、存档

进度自动存在浏览器本地,键名 jhp-cc-save,现在是 v3 JSON:盐晶、已购枪械/挂坠/印花、当前装备、全部设置(含改键与外观)、剧情状态、地图、难度、生涯统计(最高连杀、到过的地图)。

v2 老存档会自动升级,盐晶、武器、已有设置一个不丢,新字段自动补默认值。换浏览器或清缓存会丢,重要进度请在「生涯」或「暂停 → 云存档」导出 .json 文件留一份。


八、技术实现

play/clockwork-city/ 下 9 个文件,普通 <script> 按依赖顺序加载,没有构建工具:

文件 职责
index.html 页面骨架、SEO、公共脚本引用、预览环境兜底
theme.css 全套视觉(墨绿网格 / 米白纸张 / 键帽 / 网点 / 舷窗 / 雷达 / 报纸)
engine.js 伪 3D 投影、近平面裁剪、画家算法、动态 FOV、屏幕震动、多边形图元
world.js 4 张地图、掩体、四类敌人、射线求交纯函数、渲染图元与粒子
quest.js 8 枪 / 8 挂坠 / 6 印花、任务状态机、v3 存档与 v2 迁移
input.js 方向映射纯函数、机瞄、冲刺/静步、可改键位、指针锁定
audio.js WebAudio 实时合成枪声/命中/爆头/换弹/连杀/地图切换
ui.js 菜单、地图卡、军械库、商店、设置、暂停、HUD、雷达、报纸结算
main.js 状态机、主循环、射击与后坐力、波次与地图轮换、经济与存档

验证:verify_clockwork_city.js 跑方向 / 三视角 / 射线命中 / 爆头 / 掩体 / 4 地图 / 8 枪 / 3 难度 / 任务 / v2→v3 迁移 / 页面约定 / 包内容等断言;smoke_clockwork_city.js 用 DOM/Canvas mock 真跑启动、连续帧、机瞄、冲刺、开火后坐力、换图、难度与存档。全站 JS 过 node --check,PHP 过 php -l。


回到 玩法中心 · 返回 jhp.studio

📰 每日速递 更多 →