切后台、恢复与中断处理
级别:首作必学。 前后台切换是正常使用路径。玩家会锁屏、切聊天、打开系统界面,甚至在广告或资源加载中离开。
先规定恢复语义
| 中断位置 | 翻牌项目的恢复策略 |
|---|---|
| 尚未翻牌 | 回到原局,继续接受操作 |
| 已翻开一张 | 保留牌面和选择 |
| 不匹配的两张正在展示 | 暂停输入;回来后完成一次盖回 |
| 已结算 | 保持结果,不重复发奖或播放结算 |
| 正在加载 | 恢复时确认任务与场景仍一致 |
这是教学策略,其他游戏可以选择重开本局或将后台时间计入倒计时,但必须明确告知玩家并保持实现一致。
接入一个生命周期入口
使用 Cocos 时,可在应用协调层监听引擎游戏事件;需要微信特定来源参数时再使用 wx.onShow。避免两套入口各自重复保存、恢复和播放声音。
// Cocos 组件内:导入 game、Game。
onLoad() {
game.on(Game.EVENT_HIDE, this.onHidden, this);
game.on(Game.EVENT_SHOW, this.onShown, this);
}
onDestroy() {
game.off(Game.EVENT_HIDE, this.onHidden, this);
game.off(Game.EVENT_SHOW, this.onShown, this);
}
onHidden/onShown 由项目实现:前者记录暂停状态、停止输入和自己拥有的延迟任务、处理音频;后者核对当前局与资源状态,再恢复需要的表现。禁用组件时仍要接收前后台状态,恢复表现前检查组件是否启用;输入监听可以另外按 onEnable/onDisable 管理。较大项目由持续存在的应用协调层统一保存这份状态。不要仅靠计时器“通常会暂停”来保证规则。
时间与任务
如果局内计时不含后台时间,恢复时重置时间基准。需要延迟盖回的牌可以保存剩余展示时间,或在恢复后给一次完整展示窗口。首版选择后者更容易验收。
保存重要进度应发生在通关、设置变更等明确提交点;onHide 可以补充保存,但不能保证进程终止前一定执行完成。异步写入还可能失败。
不要把恢复当成奖励证据
返回前台可能来自聊天、系统或广告。只有广告服务提供的本次尝试结果,才可以进入广告奖励判断。前台事件不能证明玩家完整观看。
练习:在翻第二张、盖回前、结算时分别锁屏;快速切换三次。完成标准:没有额外回合扣除、重复结算、停在半张牌或永久锁输入。
参考:wx.onShow、wx.onHide。监听移除应使用同一函数引用,见 wx.offShow。