关于 platformer
面向 2D 平台游戏开发的组合式技能指南,涵盖跳跃手感、关卡结构、危险与目标,并指导如何组合移动、瓦片地图和设计技能。
主要功能
- 01规划跑跳控制器
- 02调整跳跃时机与高度
- 03设计单向平台和碰撞
- 04组织危险、检查点与目标
- 05规划镜头跟随和反馈效果
适用场景
- 01制作横向卷轴或单屏平台游戏
- 02改善跳跃的响应与手感
- 03设计关卡中的危险和检查点
- 04组合引擎移动与瓦片地图技能
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill platformer安装后在 Claude Code 中输入/platformer确认已加载。
附带文件references/feel-tuning.md
详细介绍
平台跳跃游戏
一份关于 2D 平台跳跃游戏的实用指南——奔跑/跳跃控制器的“手感”、关卡结构、危险和目标。这是一项组合式技能:它将引擎移动技能、瓦片地图技能和设计技能组合起来,构成一款可玩的游戏。它不会重新讲解物理或瓦片地图;它会告诉你要构建什么,以及如何让跳跃手感更好。
适用场景
- 构建横向卷轴或单屏平台跳跃游戏、“类 Mario”/“类 Celeste”游戏,或任何核心操作是在不同表面间跳跃的游戏时使用。
- 跳跃感觉飘忽、反应迟钝或“不公平”,需要改善手感(土狼时间、跳跃缓冲、可变跳跃高度、边角修正)时使用。
**不适用场景:**没有重力的俯视角移动 → 直接使用引擎移动技能。3D 第一人称穿越 → 使用 fps-shooter。网格/回合制移动 → 使用 roguelike。如需原始的运动学刚体 API,请使用 godot-2d-movement(或引擎对应的控制器技能)。
核心循环
观察间隙/危险 → 决定跳跃或移动 → 安全着陆(或死亡)→ 抵达下一个检查点/目标。 平台跳跃游戏的成败,取决于一次次跳跃的瞬时手感,而这同一次跳跃会重复数千遍。先打磨控制器;其他一切都是内容。
必备系统
- 奔跑/跳跃控制器 — 水平加速/减速、重力、跳跃,以及下方的手感辅助功能。
- 实心碰撞 + 单向碰撞 — 地面、墙壁和可“跳穿”的平台。
- 关卡几何 — 瓦片地图或手动放置的碰撞体;构成可玩空间。
- 危险 + 死亡/重生 — 尖刺、深坑、敌人;重置到上一个检查点。
- 检查点/关卡目标 — 进度标记和胜利条件(旗帜、门、出口)。
- 镜头 — 跟随玩家,带有死区和前瞻,并限制在关卡边界内。
- 表现力 — 着陆尘土、挤压/拉伸、受击停顿、音效。成本低,手感提升显著。
设计参数(让跳跃手感恰到好处)
根据结果(跳跃高度的瓦片数、到达顶点所需秒数)来调整,而不是凭原始数值调试。
| 参数 | 效果 | 合理的起始值 |
|---|---|---|
| 最大跳跃高度 | 可到达的高度 | 3–4 个瓦片 |
| 到达顶点的时间 | “重量感”/灵敏度 | 0.30–0.40 秒 |
| 下落重力倍率 | 下落更利落、不飘 | 上升重力的 1.5–2.0× |
| 土狼时间 | 离开平台边缘后仍可跳跃 | 0.08–0.12 秒(60 帧每秒时约为 5–7 帧) |
| 跳跃缓冲 | 落地前按下跳跃仍能触发跳跃 | 0.10–0.15 秒 |
| 可变跳跃截断 | 点按=短跳,按住=完整跳跃 | 松开时将向上速度乘以 0.4–0.5 |
| 顶点滞空 | 在顶部短暂悬浮,以便空中操控 | 当 ` |
| 地面加速度/摩擦力 | 反应速度与滑冰感之间的平衡 | 0.05–0.1 秒内达到最高速度 |
| 边角修正 | 跨过被 1–2 px 擦到的平台边缘 | 向侧面最多修正约 4 px |
根据手感参数推导重力和跳跃速度,不要凭空猜数值——参见模式 1。
模式
1. 根据高度 + 时间求解跳跃物理(而不是使用神秘数值)
# Pseudocode. Pick the FEEL you want, then derive the physics. y-axis points DOWN.
# From kinematics: h = (g * t^2) / 2 and v0 = g * t.
JUMP_HEIGHT = 3.5 * TILE # how high, in world units
TIME_TO_APEX = 0.35 # seconds to reach the top
gravity = (2 * JUMP_HEIGHT) / (TIME_TO_APEX ** 2) # rising gravity
jump_velocity = -(2 * JUMP_HEIGHT) / TIME_TO_APEX # negative = upward
fall_gravity = gravity * 1.8 # heavier on the way down → less floaty
2. 土狼时间 + 跳跃缓冲 + 可变高度(手感核心)
# Pseudocode in the per-frame update. dt = seconds since last frame.
# Timers count DOWN; refresh coyote while grounded, buffer on a fresh press.
if on_floor:
coyote_timer = COYOTE_TIME # 0.1
if jump_pressed_this_frame:
buffer_timer = JUMP_BUFFER # 0.12
coyote_timer -= dt
buffer_timer -= dt
# A jump is allowed if we pressed recently AND were grounded recently.
if buffer_timer > 0 and coyote_timer > 0:
velocity.y = jump_velocity
buffer_timer = 0
coyote_timer = 0 # consume both so we can't double-jump
# Variable height: releasing jump early while still rising cuts the arc short.
if jump_released_this_frame and velocity.y < 0:
velocity.y *= 0.45
# Asymmetric gravity: snappier fall than rise.
g = fall_gravity if velocity.y > 0 else gravity
velocity.y += g * dt
3. 单向平台
从上方可站立,从下方可穿过。大多数引擎会在瓦片/碰撞体上提供“单向碰撞”标志;启用后,当玩家按住 Down + Jump 时,在几帧内禁用该碰撞,让玩家向下穿过平台。不要重新实现碰撞计算。
陷阱 / 失效模式
- 未按
dt缩放逐帧移动 → 速度会随帧率变化。每次速度积分和计时器都必须使用dt。(参见physics-tuning。) - 跳跃手感飘浮 → 重力对称。让下落时的重力大于上升时的重力。
- “跳跃没有触发” → 没有输入缓冲。落地前约 0.1 s 内的按键输入应予以缓冲。
- “我掉下去了,没法跳” → 没有土狼时间。离开地面后约 0.1 s 内仍允许跳跃。
- 贴墙 / 卡在瓦片接缝处 → 使用单个胶囊 / 盒形碰撞体,而非逐瓦片碰撞体,并添加角落修正。
- 高速时穿过地板 → 为高速运动的物体启用连续碰撞检测 / 减小固定时间步长(参见
physics-tuning)。 - 摄像机突然跳动并引起恶心 → 平滑 / 插值跟随,添加死区,并限制在边界内。
- 因教学不当导致难度陡增 → 每个区域先引入一种机制,再将它们组合起来。
组合(使用这些技能构建)
- 控制器主体: 使用
godot-2d-movement(GodotCharacterBody2D);其他引擎则使用引擎核心 + 物理技能(unity-physics、phaser-arcade-physics、pygame-core)。 - 关卡: 使用
godot-tilemap/unity-tilemap-2d构建几何结构;使用level-design设计布局、节奏和教学顺序。 - 手感 / 物理: 使用
physics-tuning调整时间步长、CCD 和稳定性。 - 输入: 使用
input-systems实现输入缓冲、按键重映射和手柄支持。 - 润色: 使用
audio-design处理音效 / 音乐;使用引擎动画技能实现挤压 / 拉伸效果。 - 流程: 使用
prototype-fast,先用灰盒搭建控制器,再构建内容。
参考资料
- 关于跳跃数学推导、完整的手感调校表、角落修正、移动平台 / 单向平台以及摄像机跟随,请阅读
references/feel-tuning.md。
评论
支持 Markdown