Scene Managing
In Cocos Creator we use scene filename (without extension) to index scenes, and use the following API to load and switch scene:
cc.director.loadScene("MyScene");
Use persist node to managing multiple scenes and pass information among scenes
There's only one scene running at the same time, when switching scenes the previous scene will be destroyed. To easily store and pass information among scenes we can mark a node as persist node to prevent it from being destroyed during scene switch. This way the node and all the component instances attached to it will remain in memory.
cc.game.addPersistRootNode(myNode);
The above API will make myNode
a persist node across scenes. We can store information for player profile or necessary data needed to initialize next scene.
To revert a persist node to normal node:
cc.game.removePersistRootNode(myNode);
Beware the above API will not destroy the node immediately, only mark it as 'destroyable' for next scene switch.
Global variable
We can also store and pass information using global variable. For details please read Global Variable.
Scene loaded callback
When loading scene, you can pass a function as the callback when scene loaded:
cc.director.loadScene("MyScene", onSceneLaunched);
onSceneLaunched
is the callback function declared in the same script.
Since it can only be declared in the same script, it's better to call loadScene
from a persist node so that the component instance will stay in memory for callback function to continue running.
Preload scene
cc.director.loadScene
will destroy previous scene and run new scene right after the new scene is completely loaded. Sometimes we need to load new scene in the background when still running previous scene, and only switch scene when new scene is loaded. We can use preloadScene
to do this:
cc.director.preloadScene("table", function () {
cc.log("Next scene preloaded");
});
Once callback is fired, you can call loadScene
at any time to immediately switch scenes.
cc.director.loadScene("table");
It will be totally fine to call cc.director.loadScene
at any time even if the preloading is not yet finished, the scene will be launched after preloaded automatically. You can take Black Jack demo as an example.
Notice Using cc.loader.loadRes
to load assets in next scene and call runScene
method to switch scene is deprecated!
// DO NOT USE THE FOLLOWING METHOD!
cc.loader.loadRes('MyScene.fire', function(err, res) {
cc.director.runScene(res.scene);
});