<!-- title: 《javascript-racer》一条马路，铺出伪3D生意 -->
<!-- domain: games -->
<!-- repo: jakesgordon/javascript-racer -->

棋盘、卡牌、放置、单词我们都聊过了，这回换条赛道——字面意义上的赛道。今天挖的仓库是 `jakesgordon/javascript-racer`：一个用纯 JavaScript 写的伪3D公路赛车游戏。没有引擎、没有依赖、没有构建工具，打开浏览器就能跑。它最出名的不是玩法多复杂，而是它把“怎么用几百行代码骗出3D速度感”这件事拆成了四个版本，一步一个脚印教你抄。十几年过去，无数H5赛车小游戏里都有它的影子，而原作者一分钱变现的痕迹都没有——这本身就是个值得聊的故事。

## 一、仓库档案

- **仓库**：`jakesgordon/javascript-racer`
- **作者**：Jake Gordon，个人开发者，同时是游戏圈著名技术博客 codeincomplete.com 的作者
- **语言**：JavaScript，零依赖，原生 Canvas 2D 渲染
- **License**：宽松开源协议（以仓库页面为准，可自由改皮商用）
- **更新状态**：老仓库，核心内容多年前已完成，之后基本停更——但正因为停更，它成了一份“不会再变动的教材”
- **仓库结构**：最大的特色是按版本渐进组织——`v1.straight`（直道）、`v2.curve`（弯道）、`v3.hills`（起伏+路景）、`v4.final`（完整游戏），每个版本都是一个能独立运行的完整小项目
- **在线Demo**：README 链接了作者博客上 v1 到 v4 四个可玩版本（据仓库页面），从“一条直路”到“带AI车流和圈速计时的完整赛车”一路玩下来，等于亲眼看一个游戏怎么被一行行长出来

一句话定性：**这不是一个游戏仓库，这是一台“赛车游戏制造机”的解剖标本**。你抄的不只是代码，是一套可以反复换皮的方法论。

## 二、这游戏是什么

一句话说清玩法：**你开一辆车在Out Run式的公路上狂飙，在起伏弯道里躲避车流、贴线超车，抢更快的一圈**。没有道具、没有改装、没有剧情——就是油门、刹车、左右转向，加上一条无限延伸的马路。

```mermaid
flowchart TD
    A[踩油门出发] --> B[读前方路面与弯道]
    B --> C{车流缝隙在哪}
    C -->|贴线钻缝惊险超车| D[速度拉满爽感爆棚]
    C -->|距离误判一头撞上| E[追尾减速重来一段]
    D --> F[冲线刷新圈速]
    E --> F
    F --> G[这一圈明明还能更快]
    G -->|再来一局| A
    G -->|换个超车路线| B
```

玩家每回合做的事极简：方向键左右挪、油门踩死、偶尔刹车。系统反馈的东西却很密：车身贴弯道内侧时的离心甩动、逼近前车时的距离压迫感、超车瞬间速度表的回升、冲线时圈速差零点几秒的懊恼。驱动“再来一局”的就一句话——**这一圈我明明可以更快**。

## 三、为什么上头

拆开看，这个玩法把几条经典的成瘾机制塞进了三分钟一局的小盒子里：

**1. 速度感是最便宜的多巴胺。** 伪3D的手法让路面分段从屏幕深处扑面而来，路边树和广告牌飞速放大掠过——画面其实只是Canvas 2D上的缩放贴图，但人脑对“高速逼近的物体”毫无抵抗力。美术成本约等于零，反馈强度却拉满。对比一下：做一款三消游戏，你得做几十个关卡的特效打磨才有这种瞬时爽感；赛车题材，速度本身就是特效。

**2. 风险回报设计在每一次超车里。** 路上车流越密，超车的缝隙越窄；你越贴近前车变道，收益（不损失速度）越大，撞上去的惩罚（速度掉一半）也越痛。玩家永远在“稳一点”和“莽一点”之间摇摆，而“莽成功”的记忆点远强于“稳通过”——这正是让人喊出“再来一局”的那一下。

**3. 圈速是自带攀比属性的进度条。** 游戏没有存档没有等级，唯一被记录的是圈速。同一个赛道跑一百次，每次都在跟上一圈的自己较劲。这是最廉价的“进度感”实现方式：不需要数值成长系统，一个计时器就够了。你把它换成“最高分”，它就是街机；换成“每日最佳”，它就是排行榜运营位。

**4. 心流曲线靠物理参数硬调出来。** 直道上速度天花板拉高、弯道离心力把人往外推、出弯压线有轻微颠簸——玩家一直在“可控边缘”上跳舞。这个仓库把所有手感参数（加速度、刹车力、离心系数、颠簸减速）都做成了明晃晃的常量，改一个数字手感立变。上头与否，说到底就是这十几个数字调得好不好。

**5. 一局三分钟，失败成本趋近于零。** 没有开局动画、没有载入、没有教程强制。撞车了？一秒半恢复速度继续跑。这种“低沉没成本+高频循环”结构，正是H5小游戏和短视频时代留存模型最喜欢的形状。

## 四、技术拆解

这个仓库真正值钱的是那套**分段投影伪3D渲染法**，理解了它，你就能徒手造出任何“假3D公路”游戏：

- **道路即数组**：整条公路是一个 `segments` 数组，每段记录起止点的世界坐标、曲率值、颜色（每3段明暗交替，做出路面条纹的飞速滚动感）。道路不存在“尽头”，摄像机往前开，数组循环取用即可。
- **一帧一投影**：每帧从摄像机位置开始，逐段把世界坐标透视投影到屏幕上：`缩放 = 相机深度 / 距离`，屏幕y坐标按缩放绘制。近处画得粗、远处画得细，循环绘制几百段，一条无限公路就成了。核心公式就一个除法，任何会写递归的人五分钟能看懂。
- **弯道是累积出来的**：不改变任何3D数学，只是每画一段就把横向偏移累加该段的 `curve` 值——远处的路就“弯”了。弯道离心力再用 `速度比例 × 离心系数` 把玩家往外推。两行代码，弯道的视觉和手感都有了。
- **山丘是缓动插值**：每段定义起伏曲线的进入/保持/离开区间，y坐标用缓入缓出函数过渡。坡顶视野的开阔感、冲坡失重感，全靠这个插值函数的形状。
- **精灵即缩放贴图**：路边树、广告牌、对手车全是按投影缩放粘贴的2D图。对手AI只是“在固定车道偏移上以低于你的速度前进”，碰撞检测就是同一段路上的z距离和横向偏移判断——简单到不像话，但玩起来完全成立。
- **渐进式版本结构**：v1只有直道，v2加弯道，v3加起伏和路景，v4加AI车流、圈速计时和游戏状态机。每一步的diff都不大，最适合“抄一层会一层”的学习路径。
- **可直接复用的组件**：伪3D投影器（约百行）、道路生成器（直道/弯道/坡道的拼装函数）、车流AI、圈速状态机、以及整套手感参数表。把这些抽出来，你已经拥有一个“伪3D公路引擎”，换任何题材都能跑。

顺带一提，作者全程用最朴素的前端技术：没有模块系统花活、没有框架、没有WebGL。这意味着它的寿命极长——浏览器再怎么更新，这些API都不会deprecated。你今天抄走，五年后依然能跑。

## 五、变现观察

先说作者本人：**零变现痕迹**。Jake Gordon写这个项目是为研究“游戏渲染怎么讲清楚”，博客和代码全免费。反倒是社区把它当成了免费原料库——大量H5赛车小游戏、微信小游戏里的摩托/漂移题材，玩法骨架都能看出它的轮廓。原料免费，成菜收费，这门生意的利润全让给了动手的人。

这类伪3D赛车在真实市场上的变现路径，能跑通的大概三条：

1. **H5小游戏平台广告流**：赛车是休闲游戏平台（Poki、CrazyGames一类）的常青品类，单局短、失败即重开、页面停留时间长，插屏和激励视频的填充逻辑天然合适。改皮上架，靠播放量分成。
2. **小游戏平台的轻内购**：把圈速做成排行榜，改装（引擎、轮胎、涂装）做成金币消耗，广告看一次送金币——内购+广告双轮。伪3D赛车的开发成本撑得起这个商业模型，因为它没有3A美术摊销压力。
3. **换皮定制与源码生意**：把引擎抽成可换肤的模板，在源码市场卖授权，或者接品牌定制（奶茶店送外卖小游戏、车展宣传赛车）。这条路的门槛恰恰是“你的代码足够干净可读”——这也是这份仓库最被低估的价值。

值得注意的坑：赛车玩法的同质化极其严重，纯换皮的自然量越来越难做。真正拉开差距的是两个钩子——**每日赛道**和**圈速社交**，下面细说。

## 六、给我的灵感

**点子1：一周换皮MVP，直接投H5平台。**
复刻v4并替换题材：外卖摩托穿城市、矿车冲下矿山、雪橇闯冬季集市——美术就是路边精灵贴图+路面配色，工作量3~5天。变现用平台广告分成起步，先验证品类自然量。适合第一次出海的练手局：这个仓库把技术风险降到了零，你只剩题材选择题。

**点子2：伪3D×每日赛道，抄“一天一题”的钩子。**
把道路生成器改成种子驱动：每天全世界玩家拿到同一条随机赛道（弯道组合+坡度曲线+车流密度都由种子算出），圈速进排行榜。这是把《Hello Wordl》那套“一天只发一题”的留存机器装到赛车上——每日回访理由、社交攀比话题、内容零成本。MVP工作量2~3周（生成器参数化是难点，投影器直接搬）。变现上每日赛道免费、赛季皮肤或去广告内购收费，网页版和微信小游戏都能落。

**点子3：圈速即货币，加一层轻改装循环。**
在v4基础上加：跑圈赚金币 → 金币改引擎/刹车/涂装 → 圈速变快 → 更难的每日赛道解锁。就是把“放置-成长”的进度感嫁接到“纯技巧”玩法上，让手残玩家也能靠肝追上手快玩家。改装深度做到五六个部件、每个三级就够，别做深。工作量3~4周，适合做成小游戏平台的主力产品，广告（金币翻倍卡）+内购（终身去广告）双轨。

三个点子共同的前提：先把 `common.js` 里的伪3D投影器和道路生成器完整抄懂。这一步大概一个周末。之后无论走哪条路，你手里的都不是“一个游戏”，而是一条能反复出皮的马路。

## 七、上手

- 仓库：`https://github.com/jakesgordon/javascript-racer`
- 在线试玩：README 内链作者博客的 v1~v4 四个可玩版本（据仓库页面，若链接失效可直接 `git clone` 后本地打开 HTML 文件，零依赖）
- 配套阅读：作者博客 codeincomplete.com 上的 Javascript Racer 系列长文，从投影公式到手感调参逐版讲透，是这个仓库真正的“下半场”

十几年前的代码，零依赖，停更多年，却仍然是想入局赛车小游戏的人最该抄的第一份作业。马路是老马路，油钱得自己挣。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
