1. 核心玩法
2026/4/14大约 9 分钟
1. 超级玛丽奥——核心玩法
本章你将掌握
可以学到的 Godot 技能
| 技能 | 说明 |
|---|---|
| CharacterBody2D 物理 | 使用 move_and_slide() 实现角色移动,处理地面检测 |
| 跳跃手感调优 | 可变跳跃高度(按住跳更高)、下落加速、土狼时间 |
| TileMap 地图 | 用瓦片地图搭建关卡,设置碰撞层 |
| Camera2D 跟随 | 摄像机跟随玩家,限制左边界不回退 |
| 动画状态机 | AnimationTree 管理跑步/跳跃/受伤/死亡动画 |
| 碰撞方向判断 | 区分从上方踩踏(消灭敌人)和从侧面碰撞(受伤) |
| 道具系统 | 蘑菇/火焰花/星星的拾取与效果 |
| 场景切换 | 关卡间的切换与进度保存 |
关键 Node 节点
MarioGame(Node2D)
├── TileMap ← 关卡地图(地面/砖块/管道)
├── Player(CharacterBody2D) ← 玩家角色
│ ├── CollisionShape2D ← 碰撞体
│ ├── AnimatedSprite2D ← 动画精灵
│ └── Camera2D ← 跟随摄像机
├── Enemies(Node2D) ← 敌人容器
│ └── Goomba(CharacterBody2D)← 蘑菇怪
├── Items(Node2D) ← 道具容器
│ └── Mushroom(Area2D) ← 蘑菇道具
├── UI(CanvasLayer)
│ ├── ScoreLabel(Label)
│ ├── LivesLabel(Label)
│ └── TimeLabel(Label)
└── GoalFlag(Area2D) ← 终点旗杆游戏核心节点
点击节点可跳转到对应文档查看详细说明。
游戏系统结构图
┌─────────────────────────────────────────────────────┐
│ 超级玛丽奥系统架构 │
├─────────────────────────────────────────────────────┤
│ │
│ 输入系统 角色系统 关卡系统 │
│ ┌────────┐ ┌──────────┐ ┌──────────┐ │
│ │键盘/手柄│──────▶│ 玩家控制器│ │ TileMap │ │
│ └────────┘ └────┬─────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ ┌──────────┐ │
│ │ 物理系统 │◀────▶│ 敌人系统 │ │
│ └────┬─────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ ┌──────────┐ │
│ │ 碰撞检测 │─────▶│ 道具系统 │ │
│ └────┬─────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ ┌──────────┐ │
│ │ 摄像机 │ │ UI 系统 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘1.1 简介
超级玛丽奥(Super Mario)是一款经典的横版平台跳跃游戏(Side-Scrolling Platformer)。想象你是一个小人,在一个从左到右延伸的世界里跑跑跳跳——路上有悬崖要跳过、有敌人要踩扁、有金币要收集、有问号砖块要顶开。走到最右边的旗杆处,就算通关了。
"横版"的意思是:摄像机从侧面看这个世界,就像你在看一幅横向展开的画。"平台跳跃"的意思是:你要在各个"平台"(地面、砖块、管道)之间跳来跳去。
1.2 为什么要做这个项目?
超级玛丽奥是2D游戏史上最具影响力的游戏之一。做这个项目,你能学到平台跳跃游戏的所有核心技巧:
| 知识点 | 在游戏中的体现 |
|---|---|
| 物理系统 | 加速度、摩擦力、可变高度跳跃 |
| 角色控制 | 跑步、跳跃、下蹲、滑行 |
| 碰撞区分 | 从上面踩死 vs 从侧面碰死 |
| 关卡设计 | TileMap、平台、陷阱、终点 |
| 道具系统 | 蘑菇、火焰花、星星、金币 |
| 滚动摄像机 | 跟随玩家、限制左移 |
| 动画系统 | 跑步、跳跃、变大、受伤闪烁 |
做完这个项目,你就掌握了制作几乎所有平台跳跃游戏的核心技术。
1.3 游戏核心循环
超级玛丽奥的核心循环非常简单:
关卡开始
↓
玩家从左边出发,向右跑
↓
遇到障碍 → 跳过去
遇到敌人 → 踩扁它
遇到金币 → 收集它
遇到道具 → 捡起来
↓
到达旗杆 → 关卡通过
↓
进入下一关
↓
通关所有关卡 → 游戏胜利!用大白话说就是:从左跑到右,一路跳跳跳,别掉坑里,别被敌人碰到,到达旗杆就赢。
1.4 玩家状态
玛丽奥在游戏中有几种不同的"形态",就像穿不同的衣服有不同效果:
| 状态 | 外观 | 被敌人碰到 | 特殊能力 |
|---|---|---|---|
| 小玛丽奥 | 小个子 | 直接死亡 | 只能跑和跳 |
| 大玛丽奥 | 高个子 | 变回小玛丽奥 | 可以顶碎砖块 |
| 火焰玛丽奥 | 红白衣服 | 变回小玛丽奥 | 可以发射火球 |
| 无敌玛丽奥 | 闪烁彩虹 | 无敌(伤害敌人) | 不会被任何东西伤害 |
状态转换关系:
小玛丽奥 --吃蘑菇→ 大玛丽奥
大玛丽奥 --吃火焰花→ 火焰玛丽奥
大玛丽奥 --被敌人碰到→ 小玛丽奥
火焰玛丽奥 --被敌人碰到→ 小玛丽奥
任何状态 --吃星星→ 无敌玛丽奥(10秒后恢复)
小玛丽奥 --被敌人碰到→ 死亡1.5 核心操作
| 操作 | 按键 | 说明 |
|---|---|---|
| 移动 | A/D 或 左/右箭头 | 左右移动 |
| 跳跃 | Space 或 W 或 上箭头 | 跳起来 |
| 奔跑 | Shift(按住) | 移动速度加快 |
| 下蹲 | S 或 下箭头 | 蹲下(大玛丽奥才能蹲) |
| 发射火球 | J 或 鼠标左键 | 火焰玛丽奥专属 |
可变高度跳跃
这是平台跳跃游戏最重要的操作技巧。简单来说:轻点跳跃键 = 小跳,长按跳跃键 = 大跳。
原理就像拍皮球——轻轻一拍球弹得低,用力一拍球弹得高。在游戏里,跳跃键按得越久,跳得越高。
轻点 Space → 跳到砖块高度
长按 Space → 跳到旗杆顶部1.6 敌人类型
玛丽奥里的敌人各有特点,需要用不同的方式应对:
| 敌人 | 外观 | 行为 | 怎么对付 |
|---|---|---|---|
| 蘑菇怪(Goomba) | 棕色蘑菇 | 一直往前走,碰到墙就转向 | 从上面踩死 |
| 乌龟(Koopa) | 绿色龟壳 | 来回走动 | 踩一下变龟壳,踢龟壳撞死其他敌人 |
| 飞乌龟(Koopa Paratroopa) | 有翅膀的乌龟 | 上下飞或来回飞 | 踩一下掉翅膀变普通乌龟 |
| 食人花(Piranha Plant) | 红色花朵 | 从管道里伸出来 | 等它缩回去再通过,或用火球打 |
碰撞区域区分
玛丽奥最核心的战斗机制就是碰撞区域区分——同一只敌人,从不同方向碰到它,结果完全不同:
从上面踩到 → 敌人死亡,玛丽奥弹起
从侧面碰到 → 玛丽奥受伤这就像拍蚊子——从上面拍下去蚊子死,但如果你把手伸到蚊子旁边,蚊子可能咬你一口。
// 碰撞检测的基本逻辑
public partial class Player : CharacterBody2D
{
// 与敌人碰撞
private void OnEnemyBodyEntered(Node2D body)
{
if (body is Enemy enemy)
{
// 判断碰撞方向:如果玩家在敌人上方,就是踩踏
if (Position.Y < enemy.Position.Y - 10)
{
// 踩死敌人
StompEnemy(enemy);
}
else
{
// 被敌人碰到
TakeDamage();
}
}
}
// 踩死敌人
private void StompEnemy(Enemy enemy)
{
enemy.Die();
// 玛丽奥弹起(踩踏弹跳效果)
Velocity = new Vector2(Velocity.X, -200);
// 加分
GameManager.Instance.AddScore(100);
}
// 受伤
private void TakeDamage()
{
if (_isInvincible) return;
if (_playerState == PlayerState.Small)
{
// 小玛丽奥直接死亡
Die();
}
else
{
// 大玛丽奥/火焰玛丽奥变回小玛丽奥
ShrinkToSmall();
}
}
}# 碰撞检测的基本逻辑
extends CharacterBody2D
## 与敌人碰撞
func _on_enemy_body_entered(body: Node2D) -> void:
if body is Enemy:
# 判断碰撞方向:如果玩家在敌人上方,就是踩踏
if position.y < body.position.y - 10:
# 踩死敌人
stomp_enemy(body)
else:
# 被敌人碰到
take_damage()
## 踩死敌人
func stomp_enemy(enemy: Node) -> void:
enemy.die()
# 玛丽奥弹起(踩踏弹跳效果)
velocity = Vector2(velocity.x, -200)
# 加分
GameManager.add_score(100)
## 受伤
func take_damage() -> void:
if is_invincible:
return
if player_state == PlayerState.SMALL:
# 小玛丽奥直接死亡
die()
else:
# 大玛丽奥/火焰玛丽奥变回小玛丽奥
shrink_to_small()1.7 道具系统
道具是让玛丽奥变强的好东西:
| 道具 | 来源 | 效果 | 持续时间 |
|---|---|---|---|
| 金币 | 收集或顶砖块 | 加100分,100金币=1条命 | 瞬间 |
| 蘑菇 | 问号砖块 | 小玛丽奥→大玛丽奥 | 永久(本关内) |
| 火焰花 | 问号砖块 | 大玛丽奥→火焰玛丽奥 | 永久(本关内) |
| 星星 | 隐藏砖块 | 无敌状态,碰敌人敌人死 | 10秒 |
| 1UP蘑菇 | 隐藏砖块 | 额外一条命 | 瞬间 |
1.8 通关条件
每一关的终点是一根旗杆。玛丽奥碰到旗杆时,会顺着旗杆滑下来,旗子也会跟着落下。落下后进入小城堡,关卡通过。
旗杆得分规则:
| 触碰位置 | 得分 | 说明 |
|---|---|---|
| 旗杆顶部 | 5000分 | 最高奖励 |
| 旗杆上部 | 2000分 | 跳得很高 |
| 旗杆中部 | 800分 | 正常高度 |
| 旗杆下部 | 100分 | 没怎么跳 |
| 旗杆底部 | 50分 | 走过去的 |
1.9 关卡元素
每个关卡由以下元素组成:
┌─────────────────────────────────────────────────┐
│ │
│ [?] [B] [?] [?] │ ← 问号砖块、普通砖块
│ ┌──┐ │
│ 地面地面地面│管│ 地面地面地面 地面地面地面 地面 │ ← 管道、悬崖
│ │道│ ↑悬崖 │
│ └──┘ │
│ 🍄 🏃 🐢 🍄 🐢 🏃 旗杆 │ ← 道具、敌人、终点
└─────────────────────────────────────────────────┘| 元素 | 符号 | 说明 |
|---|---|---|
| 地面 | 实线 | 玛丽奥可以站在上面 |
| 问号砖块 | [?] | 顶开会弹出道具 |
| 普通砖块 | [B] | 大玛丽奥可以顶碎 |
| 管道 | 方块 | 场景装饰,有些有食人花 |
| 悬崖 | 空白 | 掉下去就死 |
| 金币 | 圆圈 | 收集加分 |
| 旗杆 | 线 | 到达即通关 |
下一章预告
这一章我们了解了超级玛丽奥的整体设计。下一章我们将正式搭建项目——创建项目结构、配置物理参数、搭建场景骨架。
