image.png
加载和切换场景
游戏中比较重要的就是场景的使用。
在 Cocos Creator 中,使用场景文件名(不包含扩展名)来索引指代场景。并通过以下接口进行加载和切换操作:
代码语言:javascript复制cc.director.loadScene("MyScene");
注意:引擎同时只会运行一个场景,当切换场景时,默认会将场景内所有节点和其他实例销毁。
添加场景加载回调
加载场景时,可以附加一个参数用来指定场景加载后的回调函数:
代码语言:javascript复制cc.director.loadScene("MyScene", onSceneLaunched);
回调函数在场景加载后可以用来进一步的进行初始化或数据传递的操作。
由于回调函数
只能写在本脚本中,所以场景加载回调通常用来配合常驻节点,在常驻节点上挂载的脚本中使用。
常驻节点的使用
如果需要用一个组件控制所有场景的加载,或在场景之间传递参数数据,就需要将该组件所在节点标记为「常驻节点」,使它在场景切换时不被自动销毁,常驻内存。
代码语言:javascript复制// 创建
cc.game.addPersistRootNode(myNode);
// 取消
cc.game.removePersistRootNode(myNode);
预加载场景
游戏中有些时候需要在后台静默加载新场景,并在加载完成后手动进行切换。
使用cc.director.preloadScene
接口对场景进行预加载:
c.director.preloadScene("table", function () {
cc.log("Next scene preloaded");
});
之后在合适的时间调用 loadScene,就可以真正切换场景:
代码语言:javascript复制cc.director.loadScene("table");
注意:预加载没完成,依旧可以调用 cc.director.loadScene。
获取和设置资源
加载资源
项目中需要动态加载的资源一般放在 resources 目录下,配合cc.resources.load
等接口动态加载。
// 加载 Prefab
cc.resources.load("test assets/prefab", function (err, prefab) {
var newNode = cc.instantiate(prefab);
cc.director.getScene().addChild(newNode);
});
// 加载 AnimationClip
var self = this;
cc.resources.load("test assets/anim", function (err, clip) {
self.node.getComponent(cc.Animation).addClip(clip, "anim");
});
所有需要通过脚本动态加载的资源,都必须放置在 resources 文件夹或它的子文件夹下。resources 文件夹需要在 assets 根目录 下手动创建。
image.png
注意:从 v2.4 开始,cc.loader
等接口不再建议使用,使用最新的 cc.assetManager
相关接口 接口指南。
加载SpriteFrame
图片设置为 Sprite 后,将会在 资源管理器 中生成一个对应的 SpriteFrame。 加载时候需要指定类型为SpriteFrame:
代码语言:javascript复制// 加载 SpriteFrame
var self = this;
cc.resources.load("test assets/image", cc.SpriteFrame, function (err, spriteFrame) {
self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});
加载图集中的SpriteFrame
代码语言:javascript复制// 加载 SpriteAtlas(图集),并且获取其中的一个 SpriteFrame
// 注意 atlas 资源文件(plist)通常会和一个同名的图片文件(png)放在一个目录下, 所以需要在第二个参数指定资源类型
cc.resources.load("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {
var frame = atlas.getSpriteFrame('sheep_down_0');
sprite.spriteFrame = frame;
});
资源释放
资源的释放使用调用cc.resources.release
函数
cc.resources.release("test assets/image", cc.SpriteFrame);
cc.resources.release("test assets/anim");
也可以使用 cc.assetManager.releaseAsset 来释放特定的 Asset 实例:
代码语言:javascript复制cc.assetManager.releaseAsset(spriteFrame);
资源批量加载
资源批量加载使用cc.resources.loadDir
:
// 加载 test assets 目录下所有资源
cc.resources.loadDir("test assets", function (err, assets) {
// ...
});
// 加载 test assets 目录下所有 SpriteFrame,并且获取它们的路径
cc.resources.loadDir("test assets", cc.SpriteFrame, function (err, assets) {
// ...
});
预加载资源
从v2.4 开始,除了场景能够预加载之外,其他资源也可以预加载。预加载的加载参数与正常加载时一样,不过预加载只会去下载必要的资源,并不会进行资源的反序列化和初始化工作,所以性能消耗更小,适合游戏运行中使用。
使用cc.resources类的preload 和 preloadDir 用于预加载资源。
代码语言:javascript复制cc.resources.preload('test assets/image', cc.SpriteFrame);
// wait for while
cc.resources.load('test assets/image', cc.SpriteFrame, function (err, spriteFrame) {
self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});
预加载相关接口提前加载资源,不需要等到预加载结束即可使用正常加载接口进行加载。
正常加载接口会直接复用预加载过程中已经下载好的内容,缩短加载时间。
image.png