如何获取加载的图集的指定帧

我用cc.loader.loadResAll加载了一堆的plist-png图集,现在想在代码里获取指定图集(假定为test.plist)的指定帧(假定帧名为1024.png),请问怎么获取,找遍了,但是没有发现

已找到解决方案:
1、加载资源
cc.loader.loadRes(“item/test”, function(err, results){};
也可以用cc.loader.loadResAll加载所有资源

2、获取资源
cc.loader.getRes(“item/test.plist/1024”)
资源类型为cc.SpriteFrame

注:1.1.0版本起,由于资源管理方案发生变化,以上方案不再适用

1赞

楼主,为啥我今天更新了1.1.0正式版后cc.loader.getRes好像失效了,你那里是这样吗?

我今天更新后,发现也不能用了,从引擎源码来看,cc.loader.getRes方法并没有进行更新,所以现在用不了了:sleepy:

这个 API 做了点调整,同时文档也更新了:

cc.loader.loadRes("test assets/sheep", cc.SpriteAtlas, function (err, atlas) {
    var frame = atlas.getSpriteFrame('sheep_down_0');
    sprite.spriteFrame = frame;
});
1赞

老大,你贴的这段代码是适时获取指定碎图。
那如果是预先加载,然后是在需要的时候才去使用呢?比如先加载了很多装备的碎图集,
然后根据装备的编号取出对应的碎图呢?应该使用哪个API

一样的,这里不限制只能用在预加载或者实时。

大神,意思就是我预先加载好,要取的时候也用loader.loadRes来取出来?

可能这样说比较清楚,
一个RPG游戏,玩家要换装备,这个装备的贴图是一个atlas图集里的碎图,
玩家点击更换装备以后,我需要取出相应装备的贴图,更换到游戏角色身上,那么我要怎么取出相应装备的贴图呢?

如果在点击更换装备的时候用loaer.loadRes,加载相应的图集,速度很慢,

我第意思是

在玩家刚刚进游戏的时候用loader.loadResAll加载好所有的装备的图集,在玩家点击更换装备的时候,我直接从加载好的资源里取出来,更换到游戏角色身上,这时就很快,不知道这样说能不能理解:sweat_smile:

你可以预先加载,然后存起来。也可以要用到时再重新加载一次,第二次加载会很快。

我大概明白了

这里我应该用cc.loader.loadResAll加载所有图集资源还是一个atlas用一次cc.loader.loadRes,十个atlas用十次?

然后我声明一个数组或者对象,保存加载好的资源(假设我用loadResAll)比如
var allAtlas = [];

cc.loader.loadResAll(“atlas”, cc.SpriteAtlas, function(err, atlases){
for(let i = 0; i < atlases.length; i++){
allAtlas.push(atlases[i]);
}
})

这里问题就来了,如果我用loader.loadResAll,我要通过什么索引去获得指定的图集呢?比如我加载的图集里有个名叫image的图集,我要怎么获取这个图集?或者获得指定图集下的碎图呢?如果我是声明了一个对象来保存所有图集,对象的key和value分别是什么呢?

还有这个


我是怎么知道sheep_run_0这张碎图是在atlases[0]里面还是在atlases[1]里面还是在atlases[2]呢?是根据图集在资源管理器里面的排序吗?

这里是我在进入游戏时加载所有资源(不管是用一次cc.loader.loadResAll还是用很多次cc.loader.loadRes),

然后需要用的时候,比如用户点击更换装备的时候,再次调用cc.loader.loadRes来获取已经加载好的资源吗?

如果是通过这个获取的话,不会重复加载吗(同一个资源加载两次)?

还是说cc.loader.loadRes加载图片A的时候先判断图片A有没有被加载,

如果被加载,cc.loader.loadRes就不会执行任何操作,直接返回图片A,

如果没有加载过图片A,就加载后返回?

是这样吗?

你需要精确控制加载时机,就 loadRes 十次。需要全部同时加载,就 loadResAll

你可以预先加载,然后存起来。也可以要用到时再重新加载一次,第二次加载会很快。
你需要获得指定图集时,肯定知道路径的吧?那就要用到时再重新加载一次,第二次加载会很快。

资源会自动缓存,不会重复加载。

内部确实是这样实现的

我明白了,大神,谢谢你的耐心讲解,反正就是我如果进入场景时加载所有资源,需要哪个资源的时候再用cc.loader.loadRes(“指定资源路径”)再加载一次就行了对吧?

其实我觉得cc.loader.getRes更符合逻辑一点,
cc.loader.loadRes或者cc.loader.loadResAll字面意思就是加载资源,
cc.loader.getRes字面意思就是获取资源,
不然像我这种小白就不知道获取的时候需要再次加载(虽然没有再次加载),

还有建议在文档里说明一下如何获取已经加载的资源,不然我这种智商250的人就不知道该怎么办

再次感谢你的耐心解答:kissing_heart:

大神,我还有一个问题,假设我有一个Atlas文件夹,文件夹下有:
a.png
a.plist

b.png
b.plist

c.png
c.plist

这几个图集,现在我用
cc.loader.loadResAll(“Atlas”, cc.SpriteFrame, function(err, assetses){

    })

加载好所有图集资源,这时回调函数的参数assetses是一个数组,包含所有已经加载好的图集

现在问题来了,我可以从assetses这个数组里索引到b这个图集资源吗?

如果可以,要怎么索引呢?

如果不能通过assetses数组索引,那么assetses传进来有什么作用呢?只是因为加载函数都有一个资源参数,所以才传进来吗?还是有其他什么用途?

在不可以通过数组索引的情况下,如果我所有资源都加载好了之后马上就要获取b图集,是不是必须像这样

cc.loader.loadResAll(“Atlas”, cc.SpriteAtlas, function(err, assetses){
cc.loader.loadRes(“Atlas/b”, cc.SpriteAtlas, function(err, atlas){

        })
    })

才能获取到b图集?

getRes 这个 API 本来就有了,现在不能再改变了。而且 getRes 需要用户人工确保资源已经加载完成,否则会容易出错。文档会再继续完善的,多谢反馈。

你请求的 SpriteFrame,所以索引不到图集,图集是 cc.SpriteAtlas。
如果你要的就是 SpriteFrame,那 abc 三个图集下的 SpriteFrame 都会被放到 assetses 数组中。
不过你需要人工硬编码索引顺序,所以不建议这么使用。实际上这个接口适合用来做资源批量处理,而不是用作特定资源的加载。

你那样写是可以的。不过我更推荐的做法是自己用 loadRes 依次加载 ABC。

1赞

好的,谢谢,我明白了

为什么用console.log()查看每一步都对了,但是贴图却没改变?

@jare 大神我想请教一下。
我在 loadDir 和 loadRes 都会出现 掉侦
这个该怎样处理比较适当

或是 我在大量load資源同時,我必須做到哪些調整才會正常顯示ProgressBar的progress

你好,请问最近看工作机会吗?广州研发公司招cocos creator 主程,有兴趣了解下吗?