直接進入正題!
一、加載與切換場景
代碼: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 。