游戏类型演化——赛车、马里奥、格斗、冒险格斗各自的演化流程

一句话

游戏系统论讲通用演化(空窗口→方块→角色→关卡→完整游戏);本线讲具体游戏类型的演化分支——每类游戏的核心对象不同,演化顺序也不同:赛车先有世界和相机,格斗先有动作和判定,冒险格斗先让角色走起来再打起来。


一、四类游戏的核心演化区别

1
2
3
4
赛车:       方块 → 车 → 赛道 → 驾驶 → 相机 → 比赛
马里奥: 方块 → 角色 → 地面 → 地图 → 敌人 → 关卡
格斗: 方块 → 角色 → 动作 → 攻击 → 判定 → 对战
冒险格斗: 方块 → 角色 → 地图 → 动作 → 战斗 → 探索 → 成长

格斗游戏最重要的第一个「不是车也不是地图」,而是先让两个方块在屏幕上产生攻击和反馈。 冒险格斗最核心的开发顺序:先让角色在世界里走起来,再让角色打起来,最后让世界丰富起来。


二、赛车游戏

赛道流式加载:近景赛道怎么做

赛车游戏里「往前只有近景的赛道」通常不是把整条赛道提前建出来,而是采用动态加载 + 视野范围内生成的方式。

不是没有远处,而是不让远处作为高成本对象存在。

通常组合:赛道分块 + 提前加载 + LOD + 远景假模型 + 卸载旧区域。

方案 1:分块加载(最常用)——把赛道切成小块:

1
2
[已加载][已加载][当前][未来][未来][未加载]
A B C D E F

每 100 米一个赛道块,玩家进入 C 区域:加载 D、E,卸载 A,保留 B、C。内存中永远只有「当前区域 ± 几百米」,而不是整个 20 km 赛道。

方案 2:赛道预定义 + 动态激活——设计师提前做 Track01(Start → Road Segment → Bridge → Tunnel → Finish),运行时:

1
2
if(distance(player, segment) < load_distance) Load(segment);
else Unload(segment);

远景怎么办?—— LOD(Level Of Detail):

1
2
3
100米内:高模汽车/高模树/高精度路面/碰撞
500米: 低模建筑/简单树/低精度地形
2公里: 天空盒/贴图山/假建筑

高速赛车为什么不会穿模?——提前预测:

赛车速度 300 km/h = 83 m/s。加载距离 = 速度 × 加载时间 × 安全倍数 ≈ 83 × 2 × 3 ≈ 500 米。

无限赛车(无尽模式):

1
[12][13][14][15][16] → 删除12,生成17 → [13][14][15][16][17]

道路段来自 Segment Pool(直路/弯路/坡道/隧道/跳台)随机组合。

AI 赛车: AI 不需要真实道路,使用 AI spline(道路中心线)——position = spline(t),每辆车只沿着路径参数移动。

赛车游戏的演化开发流程

主要问题:相机系统不应该放太后——车、场景、输入、相机实际上是一套系统。优先建立:

1
对象系统 → 坐标系统 → 输入 → 相机 → 内容制作

推荐的 12 阶段路线:

1
2
3
4
5
6
7
8
① 游戏框架(窗口+游戏循环)  ② 画测试对象(World坐标→Camera→Screen)
③ 车对象(Position/Rotation/Speed/Acceleration/Sprite)
④ 输入控制(W加速/S刹车/A/D转向——哪怕只是方块也应该先跑起来)
⑤ 相机系统(camera.position = car.position - offset)
⑥ 2.5D车辆(多角度Sprite:0°/45°/90°/135°/180°按方向切换)
⑦ 赛道系统(Track → Segment:Road/Decoration/Collision/Trigger)
⑧ 车辆与道路交互(碰撞:先矩形 Box 后多边形/轮胎模型;路面影响)
⑨ 完善视觉(阴影/粒子/灰尘/轮胎痕迹/天气/光照)

路面影响(车辆与道路交互的细节):

1
2
3
草地:speed *= 0.5
泥地:acceleration 降低
碰撞:velocity 反弹

关键教训:不要直接画在屏幕坐标,应该建立 Car.position = {100,50}(World 坐标)而不是 DrawRect(300,200)——否则以后加相机会全部重写。


三、复刻马里奥(横版闯关)

两种阶段划分

系统版 14 阶段(面向系统组装):

1
2
3
① 游戏框架 → ② 角色对象 → ③ 二维世界坐标 → ④ 移动与物理 → ⑤ 碰撞检测
→ ⑥ 横版相机 → ⑦ 关卡地图 → ⑧ 角色动画 → ⑨ 敌人与交互 → ⑩ 游戏规则
→ ⑪ 关卡编辑与资源管理 → ⑫ UI与菜单 → ⑬ 音效与特效 → ⑭ 优化与发布

前 1~8 阶段基本就是一个最小可玩版本(MVP)。

视觉演化版 14 阶段(从空白界面逐步演化):

1
2
3
4
① 空白窗口 → ② 绘制测试方块 → ③ 让方块移动 → ④ 让方块跳跃
→ ⑤ 替换为角色图像 → ⑥ 绘制简单地面 → ⑦ 横版滚动场景(摄像机)
→ ⑧ 砖块和障碍物 → ⑨ 敌人 → ⑩ 角色与环境交互(踩敌人/死亡)
→ ⑪ 完整关卡地图 → ⑫ 道具和动画 → ⑬ 完善游戏流程 → ⑭ 优化和扩展

核心演化链:

1
空窗口 → 方块 → 可移动方块 → 会跳的方块 → 角色 → 地面 → 关卡 → 敌人 → 完整游戏

四、格斗游戏(街霸、拳皇类)

17 阶段演化路线:

1
2
3
4
5
6
① 空白窗口 → ② 两个测试方块 → ③ 角色移动(左右/跳跃/蹲下)
→ ④ 人物图片 → ⑤ 动作动画(走路/跳跃/攻击/防御/受击)
→ ⑥ 格斗场景(背景/地面/边界)→ ⑦ 第二个角色
→ ⑧ 攻击判定(攻击范围/碰撞区域/命中检测)→ ⑨ 受击反馈(掉血/硬直/击退/倒地)
→ ⑩ 战斗规则(生命值/时间/胜负)→ ⑪ 连招系统 → ⑫ 防御与特殊机制
→ ⑬ 电脑AI对手 → ⑭ 完善角色系统 → ⑮ UI和游戏流程 → ⑯ 音效和特效 → ⑰ 优化和扩展

整体演化链:

1
2
空窗口 → 方块 → 两个方块移动 → 人物图片 → 人物动作 → 攻击动作
→ 攻击判定 → 受击反馈 → 血条和胜负 → 连招系统 → AI → 完整格斗游戏

五、冒险格斗游戏(双截龙、热血物语、忍者龙剑传)

冒险格斗 = 横版闯关的地图成长 + 格斗游戏的动作系统

18 阶段演化路线:

1
2
3
4
5
6
① 空白窗口 → ② 测试方块角色 → ③ 角色移动 → ④ 角色图片
→ ⑤ 简单场景地面 → ⑥ 横版地图滚动 → ⑦ 场景元素(箱子/门/障碍/陷阱)
→ ⑧ 攻击动作 → ⑨ 敌人角色 → ⑩ 战斗碰撞系统(攻击判定/受击判定/伤害计算)
→ ⑪ 敌人行为(追踪/攻击/防御/死亡AI)→ ⑫ 角色成长系统(生命/经验/装备/技能)
→ ⑬ 关卡结构(多区域/路线/关卡)→ ⑭ 剧情和任务系统(NPC/对话/任务目标)
→ ⑮ 物品和资源系统(金币/道具/武器/防具)→ ⑯ Boss战系统 → ⑰ UI和游戏流程 → ⑱ 优化和扩展

整体演化链:

1
2
空窗口 → 方块 → 可移动方块 → 角色动画 → 地面场景 → 横版地图
→ 攻击动作 → 敌人 → 战斗反馈 → 成长系统 → 关卡探索 → 剧情和Boss → 完整冒险格斗游戏

六、流式加载的推荐架构

一个最小版赛车地图流式系统其实几十个类就能搭出来:

1
2
3
4
5
6
7
8
9
10
      Game World
Player
|
Track Manager
|
Segment1 Segment2 Segment3
|
Resource Manager
|
Mesh / Collision / AI

核心:

1
2
3
4
5
6
7
class TrackManager {
public:
void Update(Vector3 playerPos) {
LoadNearSegments(playerPos);
UnloadFarSegments(playerPos);
}
};

如果之前研究过 CLI/静态库架构,这个也很适合作为一个独立模块设计:TrackStreamer.dll + Renderer + Physics + AI

开放城市(极品飞车类)则更复杂:World Streaming、Async Loading、Object Pool、LOD、Occlusion Culling。


与其他线的关系

  • 与游戏系统论:游戏系统论讲通用演化(两层演化、世界建模、设计系统、ECS);本线讲具体游戏类型的演化分支
  • 与过程与流程线:本线是「演化流程」在游戏类型上的实例——过程固定(能力逐渐形成),每类游戏的流程不同
  • 与拆解与组织主题:TrackManager/Segment/ResourceManager 是拆解与组织在赛车场景的应用;流式加载是动态加载/卸载的实例(对应拆解与组织 04 的注册机制/运行时可扩展思想)
  • 与服务器线:赛道流式加载(分块+提前加载+LOD+卸载)与服务器/开放世界的流式加载是同一个思想