(七)加載和切換場(chǎng)景
在 Cocos Creator 中,我們使用場(chǎng)景文件名( 可以不包含擴(kuò)展名)來索引指代場(chǎng)景。并通過以下接口進(jìn)行加載和切換操作:
cc.director.loadScene('MyScene');
通過常駐節(jié)點(diǎn)進(jìn)行場(chǎng)景資源管理和參數(shù)傳遞
通常我們同時(shí)只會(huì)加載運(yùn)行一個(gè)場(chǎng)景,當(dāng)切換場(chǎng)景時(shí),默認(rèn)會(huì)將場(chǎng)景內(nèi)所有節(jié)點(diǎn)和其他實(shí)例銷毀。如果我們需要用一個(gè)組件控制所有場(chǎng)景的加載,或在場(chǎng)景之間傳遞參數(shù)數(shù)據(jù),就需要將該組件所在節(jié)點(diǎn)標(biāo)記為「常駐節(jié)點(diǎn)」,使它在場(chǎng)景切換時(shí)不被自動(dòng)銷毀,常駐內(nèi)存。我們使用以下接口:
cc.game.addPersistRootNode(myNode);
上面的接口會(huì)將 myNode 變?yōu)槌qv節(jié)點(diǎn),這樣掛在上面的組件都可以在場(chǎng)景之間持續(xù)作用,我們可以用這樣的方法來儲(chǔ)存玩家信息,或下一個(gè)場(chǎng)景初始化時(shí)需要的各種數(shù)據(jù)。
如果要取消一個(gè)節(jié)點(diǎn)的常駐屬性:
cc.game.removePersistRootNode(myNode)
使用全局變量
除此之外,簡(jiǎn)單的數(shù)值類數(shù)據(jù)傳遞也可以使用全局變量的方式進(jìn)行,詳見通過全局變量跨組件訪問值。
場(chǎng)景加載回調(diào)
加載場(chǎng)景時(shí),可以附加一個(gè)參數(shù)用來指定場(chǎng)景加載后的回調(diào)函數(shù):
cc.director.loadScene('MyScene', onSceneLaunched);
上一行里 onSceneLaunched 就是聲明在本腳本中的一個(gè)回調(diào)函數(shù),在場(chǎng)景加載后可以用來進(jìn)一步的進(jìn)行初始化或數(shù)據(jù)傳遞的操作。
由于回調(diào)函數(shù)只能寫在本腳本中,所以場(chǎng)景加載回調(diào)通常用來配合常駐節(jié)點(diǎn),在常駐節(jié)點(diǎn)上掛載的腳本中使用。
預(yù)加載場(chǎng)景
cc.director.loadScene 會(huì)在加載場(chǎng)景之后自動(dòng)切換運(yùn)行新場(chǎng)景,有些時(shí)候我們需要在后臺(tái)靜默加載新場(chǎng)景,并在加載完成后手動(dòng)進(jìn)行切換。
可以預(yù)先使用 preloadScene 接口對(duì)場(chǎng)景進(jìn)行預(yù)加載:
cc.director.preloadScene('table', function () {
cc.log('Next scene preloaded');
});
之后在合適的時(shí)間調(diào)用 loadScene, 就可以立即切換場(chǎng)景
cc.director.loadScene('table');
注意 使用預(yù)加載場(chǎng)景資源配合 runScene 的方式進(jìn)行預(yù)加載場(chǎng)景的方法已被廢除:
// 請(qǐng)不要再使用下面的方法預(yù)加載場(chǎng)景!
cc.loader.loadRes('MyScene.fire', function(err, res) {
cc.director.runScene(res.scene);
});