(七)加載和切換場(chǎng)景
在 Cocos Creator 中怒炸,我們使用場(chǎng)景文件名( 可以不包含擴(kuò)展名)來(lái)索引指代場(chǎng)景累驮。并通過(guò)以下接口進(jìn)行加載和切換操作:
cc.director.loadScene('MyScene');
通過(guò)常駐節(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í)例銷(xiāo)毀蜜自。如果我們需要用一個(gè)組件控制所有場(chǎng)景的加載,或在場(chǎng)景之間傳遞參數(shù)數(shù)據(jù)司澎,就需要將該組件所在節(jié)點(diǎn)標(biāo)記為「常駐節(jié)點(diǎn)」欺缘,使它在場(chǎng)景切換時(shí)不被自動(dòng)銷(xiāo)毀,常駐內(nèi)存惭缰。我們使用以下接口:
cc.game.addPersistRootNode(myNode);
上面的接口會(huì)將 myNode 變?yōu)槌qv節(jié)點(diǎn)浪南,這樣掛在上面的組件都可以在場(chǎng)景之間持續(xù)作用,我們可以用這樣的方法來(lái)儲(chǔ)存玩家信息漱受,或下一個(gè)場(chǎng)景初始化時(shí)需要的各種數(shù)據(jù)络凿。
如果要取消一個(gè)節(jié)點(diǎn)的常駐屬性:
cc.game.removePersistRootNode(myNode)
使用全局變量
除此之外,簡(jiǎn)單的數(shù)值類(lèi)數(shù)據(jù)傳遞也可以使用全局變量的方式進(jìn)行昂羡,詳見(jiàn)通過(guò)全局變量跨組件訪問(wèn)值絮记。
場(chǎng)景加載回調(diào)
加載場(chǎng)景時(shí),可以附加一個(gè)參數(shù)用來(lái)指定場(chǎng)景加載后的回調(diào)函數(shù):
cc.director.loadScene('MyScene', onSceneLaunched);
上一行里 onSceneLaunched 就是聲明在本腳本中的一個(gè)回調(diào)函數(shù)虐先,在場(chǎng)景加載后可以用來(lái)進(jìn)一步的進(jìn)行初始化或數(shù)據(jù)傳遞的操作怨愤。
由于回調(diào)函數(shù)只能寫(xiě)在本腳本中,所以場(chǎng)景加載回調(diào)通常用來(lái)配合常駐節(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);
});