Hard Road——一款漂亮的程序化生成后启示录游戏
文章摘要
Hard Road 是一款直接跑在浏览器里的程序化生成开放世界驾驶游戏,由 getbutterfly 提交到 HN,拿到 45 分和 17 条评论。
站点本身几乎不含说明文字——它是一个纯客户端渲染的 WebGL/WebGPU 应用,HTML 骨架里只有主菜单和加载提示,全部内容由 js/main.js(版本 0.7.0,约 133 KB)在运行时构建。从页面上能直接读到的部分是:加载时显示「Booting physics & world…(正在启动物理与世界)」;主菜单包含 Continue(继续)、New Game(新游戏)、Controls(操作说明)、Settings(设置);HUD 上有速度表(km/h)、HANDBRAKE(手刹)指示、一个 24 小时制时钟(初始 06:00),以及一句提示语「H — honk to visit(按 H 鸣笛以造访地标)」。
操作说明页列出的按键是:WASD / 方向键驾驶与转向,空格手刹,H 鸣笛(用于造访地标),L 车灯,I 内饰灯,F 翻正车身,R 重生,C 切换镜头,ESC 打开菜单。这里也解释了 HN 上第一批人遇到的问题——它是纯键盘操作的,没有触屏控制。
从 JS bundle 里能确认的技术细节:渲染基于 Three.js,并且带有 WebGPU 支持检测(代码里有 'WebGPU support', 'gpu' 和 'timestamp-query' 之类的能力探测字符串),失败时会回落。摄像机有五种模式:chase(追尾)、bumper(保险杠)、cockpit(座舱)、topdown(俯视)、free(自由)。HUD 元素可配置,包括 speedo、light、clock、hull(车身状态)、driven(行驶里程)、elev(海拔)、dist(距离)。游戏还带一套颇为讲究的「胶片感」后处理调色系统(hardroad.filmlook.v1),可调项包括 curve(曲线)、cool(冷调)、warmth(暖调)、sat(饱和度)、grain(颗粒)、ca(色差)、lift(提亮),以及一个 Bleach bypass(漂白旁路)效果。世界里有天气系统(代码中出现 storm、「gust front slammed(阵风锋撞上来了)」、「squall incoming(飑线逼近)」之类的事件文案)和冬季雪地相关的地形材质(snow-packed、rock-snow-ice、iced-over-ground、eroded-smoothed-rockface)。进度通过 hardroad.save.v1 存在本地,另有 hardroad.autostart 开关和截图功能。
需要说明的是:由于站点是完全客户端渲染的,本文的正文信息来自 HTML 骨架、操作说明页和对 JS bundle 的字符串提取,而非一篇作者自述。HN 上作者本人也没有发帖说明,所以关于「程序化生成的到底是什么」这个最核心的问题,评论区并没有得到官方回答。
HN 评论精华
这条帖子讨论不算热烈(17 条),而且一度被 flag 过——Evidlo 专门问了一句:「这为什么被 flag 了?这明明很酷。」但仅有的几条评论质量相当高,尤其是关于「vibecoded 指控」的那一轮交锋和一份非常具体的开发者建议清单。
第一类反应:手机上玩不了
teaearlgraycold 第一条就问:「看起来我在手机上没法控制它?」taneq 确认了同样问题(iOS),「不过看着挺好看的」,并在编辑中补充:Controls 按钮打开的帮助页只提到了按键(比如 WASD),所以应该是纯键盘操作。cush 也问了一遍能不能在手机上开车。这大概是这款作品最直接的门槛。trinsic2 则报告了一个更糟的结果:「Failed to load TypeError」。
第二类:到底什么是「程序化」的?
avaer 提出了本帖最实质的技术问题:「什么是程序化生成的?网格?贴图?」他同时给出了一句很实在的赞赏:「我印象深刻的是我竟然没能开进虚空里。这类东西我见过很多次都是单次生成、走两分钟就到头了。它是在按 chunk 无限生成吗?」他还问:这游戏的目标是什么,是像《欧洲卡车模拟》那样的驾驶模拟器吗?anigbrowl 猜「地形吧,我想」。这些问题最终没有得到作者回答。
cjkaminski 从另一个角度表达了同样的不满:「这个 demo 第一印象不错,但缺少技术细节让这个帖子感觉更像广告而不是一个可讨论的话题。」
第三类:vibecoded 指控与反驳
peyloride 只留下一句:「看起来像个 vibecode 出来的没做完的游戏。」
Conscat 的回击言简意赅:「早在 LLM 出现之前,我就能上传粗糙未打磨的业余游戏 demo 了。」p-e-w 说得更尖锐:「当然,但用不可证伪的『vibecoding』指控去诋毁一个人,总比在任何实质层面上认真对待他的作品来得容易。」
anigbrowl 给出了本帖最有价值的一条评论,也是对这场争论最好的回应:
我很喜欢它作为一个引擎。从游戏性上说,我最先会加的是车辆/轮胎损伤、油耗,以及在附近散落替换零件。也许越野的轮胎痕迹有时会通向值得一探的战利品,但常常也通向危险。既然是后启示录,盖革计数器或者野生动物都是很自然的扩展。
我不在乎它是不是 vibe-coded 的,作者显然在调校手感和操控上投入了时间和精力,也在程序化地形上找到了自然的感觉,这弥补了低多边形的画面。这里的驾驶体验比我玩过的大多数游戏都好得多——那些游戏的转向和加速常常伴随着让人分心的过度修正。
soco 对「散落零件」这条提了异议:随机散落的零件或贵重物品总让他别扭,不如让玩家找到一处废墟或车骸(既然说到轮胎痕迹)再从中打捞零件,「这样更说得通」。anigbrowl 的回应很妙:「它们也让我别扭,但我在现实世界里确实经常看到孤零零的车轮和其他碎片。」
第四类:具体的开发者建议
riidom 贡献了一份非常细致的清单:
- 帮助页上应该说明滚轮可以缩放进第一人称/引擎盖视角——不过在那之前得先修好这些视角:挡风玻璃是黑的、不透明,所以他只能用引擎盖视角;而这个视角又「太动态」了——向上开时摄像机沉到引擎块下方、能看到前悬挂,向下开时又只看得到天空、完全看不到车,导致躲避障碍很困难。
- 道路方面,可以在路边加护栏之类的障碍,让驾驶更有挑战。
- 生成方面,目前物件散布的分布感觉过于均匀,可以定义几类区域以及它们各自的景观填充方式,从而带来「整体结构感」。
- 作为 Slow Roads 的粉丝,他很喜欢这个路子:「爬上山再跳下来挺好玩的。也许可以加一辆更快的车?」
他最后那句祝福透露了作者的另一重身份:「希望你能卖出很多插件,好继续做这个 :) 已加书签,期待更新。」
dwd 报告了一些讨人喜欢的物理细节:「做得不错。越野时我发现了一些很棒的物理表现,比如高速撞上一块小石头,它会在我旁边弹跳好几秒;或者差点被卡在一个类似火山口的边沿上。」他唯一的建议是:当你绕到山脉之类的地块另一侧时,应该更容易找到回到路上的方法。
第五类:新手提问
vivzkestrel 提了一串「愚蠢但真诚」的问题,某种程度上正好呼应了 cjkaminski 对技术细节缺失的抱怨:怎么从零开始做出这样的东西?涉及哪些流程?实际需要什么技能和知识?做这类东西需要哪些库或游戏引擎?大概要多久?——同样没有得到作者回答。