admin 发表于 2020-7-31 22:26:55

CocosCreator 加载与切换场景、定时器的使用

一、加载与切换场景
代码:cc.director.loadScene("SceneName");

1. 通过常驻节点进行场景资源管理和参数传递
引擎同时只会运行一个场景,当切换场景时,默认会将场景内所有节点和其他实例销毁。如果我们需要用一个组件控制所有场景的加载,或在场景之间传递参数数据,就需要将该组件所在节点标记为「常驻节点」,使它在场景切换时不被自动销毁,常驻内存。

标记常驻节点:cc.game.addPersistRootNode(myNode);
取消常驻节点 :cc.game.removePersistRootNode(myNode);

需要注意的是上面的 API 并不会立即销毁指定节点,只是将节点还原为可在场景切换时销毁的节点。

2. 场景加载回调
代码:cc.director.loadScene("SceneName", onSceneLaunched);
上一行里 onSceneLaunched 就是声明在本脚本中的一个回调函数,在场景加载后可以用来进一步的进行初始化或数据传递的操作。
由于回调函数只能写在本脚本中,所以场景加载回调通常用来配合常驻节点,在常驻节点上挂载的脚本中使用。

3. 预加载场景
后台静默加载新场景,并在加载完成后手动进行切换。
cc.director.preloadScene("SceneName", function () {
   cc.log("scene preloaded");
});
之后在合适的时间调用 loadScene , 就可以真正切换场景。
cc.director.loadScene("SceneName");
就算预加载还没完成,你也可以直接调用 cc.director.loadScene ,预加载完成后场景就会启动。

二、使用计时器
也许有人会认为 setTimeout 和 setInterval 就足够了,开发者当然可以使用这两个函数,不过我们更推荐使用计时器,因为它更加强大灵活,和组件也结合得更好!

首先,先创建一个指向某个组件的变量,变量名为 component

// 1. 开始一个计时器
component.schedule(function() {
   // 这里的 this 指向 component
   this.doSomething();
}, 5);// 计时器将每隔 5s 执行一次。

// 2. 更灵活的计时器
var interval = 5;// 以秒为单位的时间间隔
var repeat = 3; // 重复次数
var delay = 10; // 开始延时
component.schedule(function() {
   // 这里的 this 指向 component
   this.doSomething();
}, interval, repeat, delay); // 10 秒后开始计时,每 5 秒执行一次,执行 3 + 1 次。

// 3. 只执行一次的计时器(快捷方式)
component.scheduleOnce(function() {
   // 这里的 this 指向 component
   this.doSomething();
}, 2);// 上面的计时器将在两秒后执行一次回调函数,之后就停止计时。


// 4. 取消计时器
// 开发者可以使用回调函数本身来取消计时器:
this.count = 0;
this.callback = function () {
   if (this.count === 5) {
         // 在第六次执行回调时取消这个计时器
         this.unschedule(this.callback);
   }
   this.doSomething();
   this.count++;
}
component.schedule(this.callback, 1);
// 5. 取消组件所有的计时器
this.unscheduleAllCallbacks();
注意:组件的计时器调用回调时,会将回调的 this 指定为组件本身,因此回调中可以直接使用 this 。


页: [1]
查看完整版本: CocosCreator 加载与切换场景、定时器的使用