跳至主要內容

3.x 暂停游戏解决方案

muzzik大约 2 分钟文章CocosCocosCreator游戏功能

# 前言

众所周知,我们想要全局暂停游戏的话只能调用 cc.director.pause 或者 cc.game.pause

# 讲解

由于本人工作中需要用到游戏暂停效果,所以花了一上午写了个比较全面的游戏暂停方法

首先在 3.x 中,之前的各种管理器全部都变成了 system,而我们只需要分类管理即可,下面是运行时 system

可以看到上图中 system 一共有 5 个,分别是

  • Scheduler:定时器
  • AnimationManager:动画管理器
  • TweenSystem:缓动
  • PhysicsSystem:3d 物理
  • PhysicsSystem2D:2d 物理
    其实如果项目中用到了龙骨,还有个
  • ArmatureSystem:骨骼系统

现在开始挨个暂停…


Scheduler 定时器:

// 暂停所有对象的定时器
cc.director.getScheduler().pauseAllTargets()

AnimationManager 动画管理器:

// creator只提供了系统获取接口,并没有直接的暂停所有动画的接口,
// 但是动画系统内的 _anims 保存了当前所有动画信息,所以直接挨个pause就好
let anim_system = cc.director.getSystem(cc.AnimationManager.ID);
pause_data.anim_as.splice(0, pause_data.anim_as.length, ...anim_system["_anims"].array);
pause_data.anim_as.forEach(v1 => {
    v1.pause();
});

ArmatureSystem 骨骼系统:

// 同样也没有提供接口,不过可以另辟蹊径
pause_data.dragon_bones_as = cc.director
	.getScene()
	.getComponentsInChildren(cc.dragonBones.ArmatureDisplay);
pause_data.dragon_bones_as.forEach(v1 => {
	v1.timeScale = 0;
});

TweenSystem 缓动:

cc.TweenSystem.instance.ActionManager.pauseAllRunningActions();

PhysicsSystem2D 2d 物理:

cc.PhysicsSystem2D.instance.enable = false;

PhysicsSystem 3d 物理:

cc.PhysicsSystem.instance.enable = false;

按照上面的方式就可以暂停所有当前系统内运行的对象,但不会对新增的节点暂停,如果需要排除暂停节点,就需要手动恢复了

# 代码(福音书)

内部除了游戏全局的暂停和恢复,还提供了排除暂停节点,以及单个节点的暂停和恢复

game.zip (1.5 KB)

📣 觉得很赞?分享给你的朋友吧!