mcpField
P
platformer

platformer

github.com/gamedev-skills开发5.4k6.7k 次安装今天更新
代码仓库

关于 platformer

面向 2D 平台游戏开发的组合式技能指南,涵盖跳跃手感、关卡结构、危险与目标,并指导如何组合移动、瓦片地图和设计技能。

主要功能

  1. 01规划跑跳控制器
  2. 02调整跳跃时机与高度
  3. 03设计单向平台和碰撞
  4. 04组织危险、检查点与目标
  5. 05规划镜头跟随和反馈效果

适用场景

  1. 01制作横向卷轴或单屏平台游戏
  2. 02改善跳跃的响应与手感
  3. 03设计关卡中的危险和检查点
  4. 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(或引擎对应的控制器技能)。

核心循环

观察间隙/危险 → 决定跳跃或移动 → 安全着陆(或死亡)→ 抵达下一个检查点/目标。 平台跳跃游戏的成败,取决于一次次跳跃的瞬时手感,而这同一次跳跃会重复数千遍。先打磨控制器;其他一切都是内容。

必备系统

  1. 奔跑/跳跃控制器 — 水平加速/减速、重力、跳跃,以及下方的手感辅助功能。
  2. 实心碰撞 + 单向碰撞 — 地面、墙壁和可“跳穿”的平台。
  3. 关卡几何 — 瓦片地图或手动放置的碰撞体;构成可玩空间。
  4. 危险 + 死亡/重生 — 尖刺、深坑、敌人;重置到上一个检查点。
  5. 检查点/关卡目标 — 进度标记和胜利条件(旗帜、门、出口)。
  6. 镜头 — 跟随玩家,带有死区和前瞻,并限制在关卡边界内。
  7. 表现力 — 着陆尘土、挤压/拉伸、受击停顿、音效。成本低,手感提升显著。

设计参数(让跳跃手感恰到好处)

根据结果(跳跃高度的瓦片数、到达顶点所需秒数)来调整,而不是凭原始数值调试。

参数效果合理的起始值
最大跳跃高度可到达的高度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(Godot CharacterBody2D);其他引擎则使用引擎核心 + 物理技能(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