Cocos Creator的学习笔记之—-场景切换 和 资源加载

  • Post author:
  • Post category:其他


  • 加载和切换场景
// 加载和切换操作 
//(参数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 版权协议,转载请附上原文出处链接和本声明。