发条巨城
发条巨城
原创网页蒸汽机械射击游戏 · 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
jhp.studio