检查点决定玩家愿不愿意再试一次
平台动作游戏的失败很常见:跳早了、被刺碰到、掉进坑、被移动平台挤下去。玩家能否接受失败,取决于复活是否公平。检查点太远,玩家觉得被惩罚;检查点太近,挑战没有压力;复活后敌人状态混乱、机关位置不对、镜头还停在死亡点,玩家会觉得系统粗糙。Phaser 做平台控制不难,但检查点系统需要认真设计。
检查点不是简单保存玩家坐标。它还要决定哪些状态恢复,哪些状态保留:玩家血量、临时 Buff、收集品、敌人死亡、机关开关、移动平台位置、计时器、一次性宝箱、关卡目标。不同游戏规则不同。硬核平台可能重置整个房间;休闲平台可能保留收集品和已打敌人;解谜平台可能必须重置机关。规则要在系统层明确,而不是每个对象自己猜。
检查点快照要分永久和临时
可以把状态分为永久进度、房间状态和玩家临时状态。永久进度包括已收集关键物、已开启大门、剧情进度。房间状态包括敌人位置、机关状态、平台相位、可破坏物。玩家临时状态包括生命、能量、Buff、当前速度。触发检查点时,保存一份复活快照。死亡后按规则恢复:永久进度通常保留,房间状态按关卡类型恢复,临时状态重置到检查点配置。
快照不能保存 Phaser Sprite 引用,只能保存 id 和数据。复活时,RespawnService 根据快照重建或重置对象。这样 Scene 重启也能恢复。若检查点在同一 Scene 内复活,可以局部重置;若关卡复杂,直接重载 Scene 并应用快照反而更安全。
flowchart TD
A["玩家触发检查点"] --> B["CheckpointService 保存快照"]
B --> C["PermanentState:收集和剧情"]
B --> D["RoomSnapshot:敌人、机关、平台"]
B --> E["PlayerSnapshot:位置、朝向、血量"]
F["玩家死亡或掉落"] --> G["RespawnFlow:淡出、清理危险、恢复快照"]
G --> H["PlayerController 放置到安全点"]
G --> I["Camera 恢复到检查点区域"]
G --> J["短暂无敌和输入缓冲"]
掉落保护要早于死亡判定
平台游戏中掉坑不一定要立刻死亡。可以设置 rescue zone:玩家掉到死亡线以下时,先检查是否有最近安全地面。如果游戏偏休闲,可以扣一点血并把玩家拉回最近安全点;硬核游戏则死亡并回检查点。无论哪种,安全点记录都很重要。玩家站在移动平台上时,安全点应跟随平台或记录平台 id,而不是只记录世界坐标。否则复活可能把玩家放到空中。
安全点更新要保守。玩家刚踩到刺边缘、移动平台即将消失、敌人身边,都不应成为安全点。可以要求玩家在稳定地面上停留几帧,且周围无危险,才更新安全点。调试模式显示当前安全点,会帮助你发现很多复活 bug。
敌人和机关如何重置
死亡后敌人是否复活,是设计问题。若敌人不复活,玩家可以用死亡消耗敌人,难度下降;若全部复活,玩家要重复清怪,可能烦。可以按房间类型配置:挑战房全部重置,探索房保留已击败普通敌人,Boss 房重置 Boss,收集品保留。机关也类似:一次性开关保留,临时平台重置,解谜机关可能恢复到检查点状态。
每个可重置对象需要 stable id 和 reset 方法。不要依赖对象创建顺序。RoomSnapshot 保存对象 id 到状态的映射。复活时遍历当前房间对象,按快照恢复;快照中没有的临时对象销毁;快照中有但当前不存在的对象重新创建或忽略,取决于类型。
一个检查点快照模型
下面的代码展示保存玩家和对象状态的基本结构。真实项目中可按房间拆分。
interface PlayerSnapshot {
x: number;
y: number;
facing: "left" | "right";
hp: number;
}
interface ObjectSnapshot {
id: string;
type: string;
state: Record<string, unknown>;
}
interface CheckpointSnapshot {
checkpointId: string;
player: PlayerSnapshot;
objects: ObjectSnapshot[];
collectedIds: string[];
}
export class CheckpointService {
private latest?: CheckpointSnapshot;
save(snapshot: CheckpointSnapshot) {
this.latest = structuredClone(snapshot);
}
restore() {
if (!this.latest) throw new Error("No checkpoint available");
return structuredClone(this.latest);
}
}
这里使用 clone 是为了防止后续对象状态修改污染快照。生产环境可以使用更明确的序列化方式,特别是要保存到本地或云端时。快照越纯粹,复活越稳定。
复活流程要保护玩家
复活不是瞬移。流程通常包括死亡反馈、短暂淡出、清理危险、恢复状态、镜头定位、淡入、短暂无敌、恢复输入。清理危险很重要:玩家死前发出的子弹、敌人弹幕、掉落中的碎片,如果复活后还在检查点附近,可能造成连死。RespawnFlow 应清理或暂停这些临时危险。
短暂无敌要有视觉提示,比如闪烁或透明,但不要影响玩家控制。无敌时间结束前可以允许移动和跳跃。若复活点附近仍有敌人,应暂时推开或禁用敌人攻击,保证玩家有反应时间。复活点必须是安全承诺。
镜头和音乐恢复
死亡时镜头可能跟随掉落到坑底,复活后要平滑回到检查点,而不是突然跳到玩家位置造成眩晕。可以在淡出期间直接设置镜头,淡入时已经稳定;也可以做短平滑过渡。若关卡有动态音乐,死亡和复活也要通知 AudioMixer:死亡短音效、复活恢复当前区域音乐,不要叠加多次。
HUD 状态也要同步。血量、能量、钥匙、计时器、收集品在复活后必须和模型一致。若计时挑战中死亡是否重置计时,要提前决定。速通模式通常回检查点但计时继续,练习模式可以重置局部计时。
上线前检查清单
确认检查点保存的不只是坐标;确认永久进度、房间状态、玩家临时状态分层;确认安全点只在稳定地面更新;确认移动平台安全点处理平台 id;确认敌人和机关重置规则按房间配置;确认复活前清理临时危险;确认复活有短暂无敌和输入恢复;确认镜头不会停在死亡点;确认调试模式显示当前检查点和安全点;确认 Scene 重载后快照仍可用。
平台游戏失败频繁,所以复活体验就是核心体验。Phaser 能让死亡和复活动画很快完成,但检查点规则必须先讲清楚。让玩家觉得“我输在操作,不输在系统”,他才会愿意一次次重试。
检查点激活的反馈
检查点被触发时,要给明确反馈:旗帜升起、火炬点亮、音效、短暂光效、HUD 提示。玩家必须知道这里已经成为复活点。若检查点有条件,比如需要消耗钥匙或完成房间战斗后才激活,UI 要提前说明。不要让玩家以为碰到了检查点,死亡后却回到很远的地方。
检查点也可以分层:普通检查点、章节存档点、快速传送点。普通检查点只用于本关复活,章节存档点写入长期存档,传送点可以在地图中选择。三者表现要区分。玩家对“存档”和“临时复活”的预期不同,混淆会带来投诉。
Boss 房和挑战房的特殊规则
Boss 房通常不保存 Boss 半血状态,除非设计允许分阶段续战。大多数动作游戏会在 Boss 门口设置检查点,死亡后重置 Boss 和场地,但保留玩家消耗品规则需要谨慎。若玩家使用药水失败后药水不返还,挑战会变成资源消耗;若全部返还,资源选择没有压力。规则要明确,并在 UI 中可理解。
挑战房可能要求无伤、限时或一命通关。进入挑战时可以创建临时快照,失败后退出房间或重置房间。不要把挑战失败和普通死亡混在一起。结算界面显示失败原因,允许快速重试。Phaser 中可以把挑战房作为 RoomState,RespawnFlow 根据 room type 选择恢复策略。
收集品和死亡回滚
玩家死亡后,刚收集的金币、隐藏物、钥匙是否保留?休闲平台通常保留普通收集品,硬核平台可能回滚到检查点。关键收集品建议保留,避免玩家重复拿同一个隐藏物。普通金币可以按关卡规则决定。无论选择什么,都要保持一致。收集品对象需要 id,保存 collectedIds。复活重置房间时,已永久收集的对象不再出现。
临时钥匙和任务道具要特别处理。玩家拿到钥匙后死亡,如果门也恢复锁定,钥匙是否还在背包?这取决于谜题设计。建议谜题房使用房间快照整体回滚,探索收集使用永久保留。混合规则一定要在内容制作规范里写清楚。
复活点安全验证
每个检查点发布前都要验证安全:玩家复活位置没有陷阱、不会卡墙、相机能看到角色、附近敌人不会立即攻击、移动平台位置合理。可以写一个编辑器检查脚本,扫描检查点周围 tile 和危险对象。运行时也可以在复活前做最后验证,若目标点不安全,回退到上一个检查点或安全入口。
安全验证还能防止内容更新事故。关卡改版后,原检查点旁边新增了刺,旧快照仍然指向那里。没有验证,玩家会复活即死。检查点是玩家信任系统,必须保守。
教学和难度选项
检查点密度也可以随难度变化。普通难度在每个挑战段前给检查点,困难难度只在章节中段给,练习模式允许手动放置临时检查点。不同难度不能只改敌人伤害,复活成本也会改变体验。Phaser 里可以让 CheckpointService 根据 difficulty 选择可激活的检查点集合。
新手教学中,第一次掉坑可以触发温和救援,而不是完整死亡。系统把玩家拉回安全点,提示“边缘可以短跳”。第二次以后再按正常规则。这样玩家学习平台跳跃时不会被过早惩罚。教学保护要有次数限制,并清楚进入正式规则。
速度跑和练习模式
速通玩家通常希望快速重开和精确计时。复活流程里的淡入淡出如果太长,会影响练习。可以提供练习模式:死亡后立即回检查点,跳过部分动画;正式模式保留完整反馈。计时模式要明确死亡是否继续计时,检查点是否保存分段时间。HUD 上显示当前分段和最佳分段,复活不应重置这些统计,除非玩家手动重开。
练习模式还可以支持选择已到达检查点。玩家卡在 Boss 前跳跃段,可以直接从那里练。这个功能不一定给第一次通关玩家,但对高难平台游戏很有价值。
多角色和能力变化
如果游戏有多角色或能力升级,检查点快照要记录当前能力状态。玩家在检查点后获得二段跳,然后死亡,复活时是否保留?如果二段跳是永久能力,应保留;如果是临时道具,应按房间规则恢复。角色体型不同也会影响复活安全点,大角色可能卡在小角色能站的位置。安全验证要使用当前角色碰撞体。
能力变化还会影响旧检查点。玩家获得滑翔后,某些掉落不再致命;获得冲刺后,原复活点旁边的障碍可能更容易误触。关卡回归测试应覆盖能力前后两种状态。检查点不是静态坐标,它和玩家能力一起构成复活规则。
复活日志和玩家反馈
复活系统也需要日志。记录死亡原因、死亡位置、当前检查点、恢复耗时、是否触发安全点回退、是否连续死亡。若玩家在同一个检查点连续死亡 5 次,可能是难度过高,也可能是复活点不安全。开发和关卡设计可以根据这些数据定位问题。
玩家侧反馈要简洁。死亡后显示“被尖刺击中”“掉落到深渊”“被移动平台挤压”,比单纯黑屏重来更有帮助。高难游戏可以少提示,休闲游戏应更明确。
连续死亡时,还可以提示练习模式或辅助选项,但不要强制降低难度。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。