用 Game Maker 制作《Need for Speed 2015》

Lobsters Hottest 新闻

摘要

一位开发者详细介绍了他们在 Game Maker 中重现《Need for Speed 2015》雨夜氛围的过程,涵盖 3D 汽车建模、环境构建以及基于着色器的镜面反射光照。

<p><a href="https://lobste.rs/s/kwo9cn/making_need_for_speed_2015_with_game_maker">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/08/10 23:05

TL;DR: 一位开发者使用自定义3D模型、着色器、射线投射物理、录制的汽车声音以及自制涂装编辑器,在 Game Maker 中重现了 Need for Speed 2015 的氛围。 ## 为什么选择 Game Maker? 2015年,Electronic Arts 在沉寂许久后重启了 Need for Speed 系列。该作开发周期为两年,发布后评价褒贬不一。许多玩家反映游戏存在严重问题,几乎无法游玩。不过作者是在2018年在 PS4 上购买的,当时大部分问题已通过补丁修复。游戏最突出的是其氛围:永不停歇的雨、美丽的反射、出色的画面以及优秀的音效设计。 作者想在 Game Maker 中创造类似的作品,这是他们 17 年来唯一使用过的引擎。在 Game Maker 中能否做出看起来像 Need for Speed 2015 的东西?能也不能——这取决于你愿意花多少时间,在双手被绑在背后的情况下,去重制一款精美的 3D 竞速游戏。作为一个自称受虐狂的人,作者开工了。 ## 车辆建模 项目分为两部分:首先制作一辆带有像样 3D 模型的可用汽车;其次制作环境。所选车型是 1999 年的 Toyota Celica,曾出现在 Underground 1 和 Underground 2 中。它虽然不在 Need for Speed 2015 中,但非常契合夜间街头竞速的美学。 3D 模型断断续续做了几周。它缺少一些细节,但确实看起来有点像作者自己的车。手边有真车很方便,因为建模时使用的蓝图并没有提供所有必要信息来让它看起来令人信服。 在新建的 Game Maker 项目中,一个 3D 摄像机跟随汽车。为了让摄像机平滑地滞后于汽车,作者使用两个向量之间的角度差函数,而不是汽车的正前方方向,让摄像机缓和地进出。这段代码差异对游戏手感有明显影响。 ## 构建环境 Need for Speed 2015 出奇地细致,因此作者在 Blender 中制作了几个 3D 模型:道路、人行道、路灯、建筑、外墙、管道等等。它们被导出为顶点缓冲区并加载到 Game Maker 中。使用一个结构体数组搭建了一个简单的 3D 房间编辑器,存储每个模型的名称、顶点缓冲区引用以及相关纹理。 在 draw GUI 事件中,一个循环遍历该数组,让作者选择每个单独的顶点缓冲区并将其放置到地图中。这些模型目前还没有进行批处理,尽管有些使用了纹理图集。这将是下一个大的优化点,但游戏目前运行良好。 ## 光影与着色器 Need for Speed 2015 发生在一个雨下个不停的夜晚。作者喜欢湿沥青及其光反射的外观,这是他们想加入自己游戏中的东西。 作者编写了一个着色器,支持多个光源、法线贴图、高光反射和等距柱状投影反射。对于沥青,将反照率纹理与法线贴图结合。只添加反照率纹理会让场景看起来非常“Sega Saturn 风格”,因此需要光照。 在控制对象的 create 事件中,光位置数组和光颜色数组连同数组大小一起发送到着色器。遍历这些数组时,着色器计算当前顶点位置与每个光源之间的距离,然后使用反射向量确定有多少反射光到达摄像机镜头。这决定了高光的大小和强度。 法线贴图用于将 RGB 值转换为法线向量,在原本平坦的网格上模拟出额外细节。顶点法线属性与从法线贴图采样的颜色的组合,使沥青看起来比实际细致得多。 高光有些夸张,但正如作者所说,“就像我们的主和救世主 Gabe Newell 曾经说过的,现实感并不让我太感兴趣。” 对于反射,作者曾尝试类似立方体贴图的效果,但 Game Maker 不支持立方体贴图反射——至少不支持作者目前理解的那种方式。于是,他们使用一个函数将 3D 坐标转换为 2D 坐标,从等距柱状投影纹理中采样像素。它并不完美,但看起来相当酷。 光照到位后,游戏呈现出了强烈的氛围感。但环境只是一款完整竞速游戏的一小部分。 ## 驾驶物理与声音 对于地下风格竞速游戏来说,有两样东西不可或缺:驾驶物理和声音。 在玩家对象的 create 事件中,变量决定了汽车的行为:原厂马力、重量、飞轮重量、进气方式和发动机类型。这些变量还决定了汽车的声音、换挡和驾驶方式。 控制方式很简单: - **W** — 加速 - **A / D** — 左转 / 右转 - **S** — 刹车和倒车 加速时,油门值在 0 到 1 之间缓和变化,决定汽车加速的快慢。加速度还取决于当前所选挡位。目前只有手动变速箱,这意味着你随时都要负责自己所处的挡位——如果你愿意,甚至可以进行“money shift”(强制降挡导致转速超限)。 物理效果部分是通过向汽车变换矩阵添加轻微旋转来实现伪物理的,使汽车在加速和刹车时看起来像是受到 G 力影响。车轮上的简单射线投射判断汽车是否在人行道上行驶。当真正的高度地形实现后,这一做法会改变,但目前有效。 声音方面,作者用一台老旧的 Blue Yeti 录制了自己车子的排气管声,还有其他几种音效,以尽可能接近真实。还添加了换挡和行驶的拟音效果,比如皮带和变速箱发出的轻微啸叫声。毕竟,这是一辆 28 年的老车。 这辆 Celica 配备了来自 Yamaha 的 2ZZ 发动机,具有 Toyota 的“lift”技术——相当于 Honda 的 VTEC。当发动机达到 6200 RPM 时,凸轮轴会切换,提供更大的马力和激进的声浪,同时“勉强跟上前面的 Prius”。 `audio_sound_pitch` 函数让发动机声音跟随汽车的转速区间。右侧的转速表与 Celica 自己的转速表非常相似。 ## 自定义 Need for Speed 2015 以自定义系统著称。虽然车身套件和改装件尚未实装,但已经有一些自定义选项了。 你可以更改汽车涂装颜色以及该颜色所用的材质,在金属漆、亮光、缎面和哑光之间选择。金属漆会为涂装添加细微金属颗粒,而哑光会减弱反射。颜色选择器使用了 `draw_get_pixel` 方法——作者说向 Game Maker 社区的人提到这个,可能会被痛批。 最喜欢的功能是涂装编辑器。玩家可以给汽车添加贴花,但作者最初不知道如何实现。第一个想法是将五个不同的曲面作为纹理采样器发送到着色器,对应汽车的五面。这行不通,因为 Game Maker 原生最多只支持八个纹理采样器,包括基础纹理在内。 解决方案是使用一个被划分为五个区域的单一曲面。`gpu_set_scissor` 函数——作者在翻阅 Game Maker 手册时偶然发现的——正是所需之物。纹理被划分为汽车每一侧的独立区域。五个独立的数组允许分别向每一侧添加贴花。数组中的每个元素代表一个贴花,可以移动、旋转、缩放和放置。这个系统很简单,还不支持复制、粘贴或删除。 为了避免侵犯他人作品并远离生成式 AI,作者用一块旧的绘图板绘制了自定义贴花。着色器通过比较顶点位置和方向与纹理的每一部分,将贴花纹理的每个部分投影到目标侧面。这确保放在左侧的贴花不会出现在右侧,反之亦然。在片段着色器中,从顶点着色器接收的坐标将纹理投影到汽车上。它并不完美,但效果出奇地好。 ## 未来计划 作者对这个项目有宏大的计划: - 可以拿自己的车下注并赢取对手车辆的竞速模式 - 更多自定义选项 - 更多车辆 - 更好的优化 - 更好的音效 在作者看来,这款游戏确实有点像 Need for Speed 2015,只是画面更差。氛围非常接近——但没有那些烦人的电话。 来源:Making Need For Speed 2015 with Game Maker (https://www.youtube.com/watch?v=ffGqjOBowIc)

相似文章

Claude 5 Opus 与 3D 月光场景

Reddit r/singularity

一位开发者分享了 Claude 5 Opus 如何从零生成一个详细的 3D 月光场景,编写了超过 944KB 的 JavaScript,并计划将其改造成一款射击游戏。

仅用一条文本提示生成了电影质感的未来汽车预告片

Reddit r/ArtificialInteligence

作者展示了一个自动化的 AI 工作流,利用 Seedance 2.0 仅通过单条文本提示即可生成电影级汽车预告片。文章突出了在流程编排方面的进步,同时也指出了在画面一致性和物理真实性方面尚存的问题。

像1993年那样制作图形

Hacker News Top

一位开发者详细介绍了如何构建《Catlantean 3D》——一款采用1993年时代图形技术(256色、320x240分辨率、手工制作资产、无人工智能)的第一人称射击游戏,计划在Steam上发布,重点讲解调色板渲染和资产创建。