- 加载和切换场景
// 加载和切换操作
//(参数1:场景文件名,不包含扩展名)
//(参数2:加载后的回调)
cc.director.loadScene("MyScene",onSceneLaunched);
// 预加载
cc.director.preloadScene("table",func);
// 设置常驻节点
cc.game.addPersistRootNode(myNode);
// 取消接地昂常驻属性
cc.game.removePersistRootNode(myNode);
- 获取和加载资源
/*
所有继承自 cc.Asset 的类型都统称资源,
如 cc.Texture2D, cc.SpriteFrame, cc.AnimationClip, cc.Prefab 等.
当引擎在加载场景时,会先自动加载场景关联到的资源,这些资源如果再关联其它资源,
其它也会被先被加载,等加载全部完成后,场景加载才会结束。
*/
// (1)通过脚本设置属性,可以在属性检查器里设置资源
// (2)动态加载
// 注意:
// 1、所有需要通过脚本动态加载的资源,都必须放置在resources文件夹或它的子文件夹下.
// (resources 需要在assets文件夹中手动创建,必须位于assets的根目录)
// 2、资源动态加载的时候都是 异步 的,需要在回调函数中获得载入的资源。
/**
* 动态加载 Asset
**/
// cc.loader.loadRes 这个 API 来专门加载那些位于 resources 目录下的 Asset。
// loadRes一次只能加载单个Asset.
cc.loader.loadRes("test/prefab",function(err,prefab){});
// loadRes加载图片类型将会是cc.Texture2D,必须制定资源类型,才能加载到图片的cc.SpriteFrame
// 第二个参数也可以是资源类型,(如同一路径的同名资源,player.clip和player.psd)
cc.loader.loadRes("test assets/image", cc.SpriteFrame, function (err, spriteFrame){});
// 加载图集中的SpriteFrame
cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {
var frame = atlas.getSpriteFrame('sheep_down_0');
sprite.spriteFrame = frame;
});
//资源释放
// 释放单个资源(第二个参数指定类型)
cc.loader.releaseRes("test assets/image", cc.SpriteFrame);
cc.loader.releaseRes("test assets/anim");
// 用来释放特定类型的Asset实例
cc.loader.releaseAsset(spriteFrame);
// 资源批量加载
// 加载test目录下所有资源
cc.loader.loadResDir("test", function (err, assets) {});
// 加载test目录下所有SpriteFrame,并获取它们的路径
cc.loader.loadResDir("test", cc.SpriteFrame, function (err, assets, urls) {});
/**
* 加载远程资源和设备资源
**/
// cc.loader.load
// (1) 加载远程贴图资源。
// (2) 如果通过其他方式下载资源到设备储存中,需要用此API加载
(loadRes等只适合用于包内的资源和热更的本地资源)
// 远程 url 带图片后缀名
cc.loader.load("http://unknown.org/someres.png", function (err, texture) {});
// 远程 url 不带图片后缀名,此时必须指定远程图片文件的类型
remoteUrl = "http://unknown.org/emoji?id=124982374";
cc.loader.load({url: remoteUrl, type: 'png'}, function () {});
// 用绝对路径加载设备存储内的资源,比如相册
var absolutePath = "/dara/data/some/path/to/image.png"
cc.loader.load(absolutePath, function () {});
/* 注意:
1、原生平台远程加载不支持图片文件以外类型的资源。
2、这种加载方式只支持图片、声音、文本等原生资源类型,
不支持 SpriteFrame、SpriteAtlas、Tilemap 等资源的直接加载和解析
(需要后续版本中的 AssetBundle 支持)
3、Web 端的远程加载受到浏览器的 CORS 跨域策略限制,如果对方服务器禁止跨域访问,那么会加载失败,
/**
* 资源的依赖和释放
**/
/*
1)首先最为重要的一点就是:资源之间是互相依赖的。
(如:Prefab 资源中的 Node 包含 Sprite 组件,
Sprite 组件依赖于 SpriteFrame,SpriteFrame 资源依赖于 Texture 资源,
而 Prefab,SpriteFrame 和 Texture 资源都被 cc.loader 缓存起来了)
2)JavaScript 中无法跟踪对象引用
*/
// 直接释放某个贴图
cc.loader.release(texture);
// 释放一个 prefab 以及所有它依赖的资源
var deps = cc.loader.getDependsRecursively('prefabs/sample');
cc.loader.release(deps);
// 如果在这个 prefab 中有一些和场景其他部分共享的资源,你不希望它们被释放,可以将这个资源从依赖列表中删除
var deps = cc.loader.getDependsRecursively('prefabs/sample');
var index = deps.indexOf(texture2d._uuid);
if (index !== -1)
deps.splice(index, 1);
cc.loader.release(deps);
/*
3)JavaScript 的垃圾回收是延迟的
想象一种情况,当你释放了 cc.loader 对某个资源的引用之后,由于考虑不周的原因,游戏逻辑再次请求了这个资源。
此时垃圾回收还没有开始(垃圾回收的时机不可控),或者你的游戏逻辑某处,仍然持有一个对于这个旧资源的引用,
这意味着资源还存在内存中,但是 cc.loader 已经访问不到了,所以会重新加载它。这造成这个资源在内存中有两份同样的拷贝,浪费了内存。
如果观察到游戏使用的内存曲线有这样的异常,请仔细检查游戏逻辑,是否存在泄漏,如果没有的话,垃圾回收机制是会正常回收这些内存的。
*/
版权声明:本文为Allen_ww原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。