本文共 1792 字,大约阅读时间需要 5 分钟。
直接进入正题!
一、加载与切换场景
代码:cc.director.loadScene("MyScene");
1. 通过常驻节点进行场景资源管理和参数传递
引擎同时只会运行一个场景,当切换场景时,默认会将场景内所有节点和其他实例销毁。如果我们需要用一个组件控制所有场景的加载,或在场景之间传递参数数据,就需要将该组件所在节点标记为「常驻节点」,使它在场景切换时不被自动销毁,常驻内存。
标记常驻节点:cc.game.addPersistRootNode(myNode);
取消常驻节点 :cc.game.removePersistRootNode(myNode);
需要注意的是上面的 API 并不会立即销毁指定节点,只是将节点还原为可在场景切换时销毁的节点。
2. 场景加载回调
代码:cc.director.loadScene("MyScene", onSceneLaunched);
上一行里 onSceneLaunched 就是声明在本脚本中的一个回调函数,在场景加载后可以用来进一步的进行初始化或数据传递的操作。
由于回调函数只能写在本脚本中,所以场景加载回调通常用来配合常驻节点,在常驻节点上挂载的脚本中使用。
3. 预加载场景
后台静默加载新场景,并在加载完成后手动进行切换。
cc.director.preloadScene("table", function () {
cc.log("Next scene preloaded");
});
之后在合适的时间调用 loadScene , 就可以真正切换场景。
cc.director.loadScene("table");
就算预加载还没完成,你也可以直接调用 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 。
本文同步分享在 博客“战 胜”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
转载地址:http://dezct.baihongyu.com/