Laya Loader 图集 解析

一、图集

1.调用

Laya.loader.load([{ url: "res/atlas/comp.json", type: Loader.ATLAS }], 
Handler.create(this, this.onLoaded));

从chrome中的network可以看到,加载完这个json后,会去加载相应的png

2.json的结构

meta中会记录接着要加载哪个image

随便拆开一个图片,看看属性:


"Chips_10.png"
{
    "frame":{"h":114,"idx":0,"w":111,"x":0,"y":0},
    "rotated":false,"sourceSize":{"h":114,"w":111},
    "spriteSourceSize":{"h":114,"w":111,"x":0,"y":0},
    "trimmed":false
}

如果图集超过了一张png,meta中会用逗号分隔来存储:

"meta":{"image":"card.png,card1.png,card2.png","prefix":"card/"}

3.Laya.net.Loader.as中的onLoader方法

} else if (type === ATLAS) {
    //处理图集
    if (!data.src && !data._setContext) {
        if (!_data) {
            this._data = data;
            //构造加载图片信息
            if (data.meta && data.meta.image) {
                //带图片信息的类型
                var toloadPics:Array = data.meta.image.split(",");
                var split:String = _url.indexOf("/") >= 0 ? "/" : "\\";
                var idx:int = _url.lastIndexOf(split);
                var folderPath:String = idx >= 0 ? _url.substr(0, idx + 1) : "";
                //idx = _url.indexOf("?");
                //var ver:String;
                //ver = idx >= 0 ? _url.substr(idx) : "";
                for (var i:int = 0, len:int = toloadPics.length; i < len; i++) {
                    toloadPics[i] = folderPath + toloadPics[i];
                }
            } else {
                //不带图片信息
                toloadPics = [_url.replace(".json", ".png")];
            }
            
            //保证图集的正序加载
            toloadPics.reverse();
            data.toLoads = toloadPics;
            data.pics = [];
        }
        event(Event.PROGRESS, 0.3 + 1 / toloadPics.length * 0.6);
        return _loadImage(toloadPics.pop());
    } else {
        _data.pics.push(data);
        if (_data.toLoads.length > 0) {
            event(Event.PROGRESS, 0.3 + 1 / _data.toLoads.length * 0.6);
            //有图片未加载
            return _loadImage(_data.toLoads.pop());
        }
        var frames:Object = this._data.frames;
        var cleanUrl:String = this._url.split("?")[0];
        var directory:String = (this._data.meta && this._data.meta.prefix) ? 
        this._data.meta.prefix : cleanUrl.substring(0, cleanUrl.lastIndexOf(".")) + "/";
        var pics:Array = _data.pics;
        var atlasURL:String = URL.formatURL(this._url);
        var map:Array = atlasMap[atlasURL] || (atlasMap[atlasURL] = []);
        map.dir = directory;
        for (var name:String in frames) {
            var obj:Object = frames[name];//取对应的图
            var tPic:Object = pics[obj.frame.idx ? obj.frame.idx : 0];//是否释放
            var url:String = URL.formatURL(directory + name);
            
            cacheRes(url, Texture.create(tPic, obj.frame.x, obj.frame.y, obj.frame.w, obj.frame.h, 
            obj.spriteSourceSize.x, obj.spriteSourceSize.y, obj.sourceSize.w, obj.sourceSize.h));
            loadedMap[url].url = url;
            map.push(url);
        }
        
        delete _data.pics;
        
        /*[IF-FLASH]*/
        map.sort();
        complete(this._data);
    }
}

可以看到,第一步是去加载data.meta.image中相应的png。在第二步的时候,判断_data.toLoads.length > 0,如果还有没加载完的,接着去加载。

var atlasURL:String = URL.formatURL(this._url);
var map:Array = atlasMap[atlasURL] || (atlasMap[atlasURL] = []);

这是准备放到atlasMap里,然后去遍历_data.frames,使用Texture.create方法把小图片全部放入loadedMap里。注意看区别:

/** @private 已加载的资源池。*/
public static const loadedMap:Object = {};
/**@private 已加载的图集资源池。*/
protected static const atlasMap:Object = {};
Loader.loaderMap
Loader.atlasMap
Loader.getRes
二、图片

1.调用

assets.push({ url: this.getExtraUrl("BetTable_light", "bg"), 
type: Laya.Loader.IMAGE });
        protected function onLoaded(data:* = null):void {
            var type:String = this._type;
            if (type === IMAGE) {
                var tex:Texture = new Texture(data);
                tex.url = _url;
                complete(tex);
            }

        /**
         * 加载完成。
         * @param   data 加载的数据。
         */
        protected function complete(data:*):void {
            this._data = data;
            if (_customParse) {
                event(Event.LOADED, data is Array ? [data] : data);
            } else {
                _loaders.push(this);
                if (!_isWorking) checkNext();
            }
        }
在endLoad中调用cacheRes
loaderMap中,不打包在图集中,外部加载的图片
三、Laya.net.URL类

1.formatURL

        /**
         * 格式化指定的地址并    返回。
         * @param   url 地址。
         * @param   base 路径。
         * @return 格式化处理后的地址。
         */
        public static function formatURL(url:String, base:String = null):String {
            if (!url) return "null path";
            
            //如果是全路径,直接返回,提高性能
            if (url.indexOf(":") > 0) return url;
            //自定义路径格式化
            if (customFormat != null) url = customFormat(url, base);
            
            var char1:String = url.charAt(0);
            if (char1 === ".") {
                return formatRelativePath((base || basePath) + url);
            } else if (char1 === '~') {
                return rootPath + url.substring(1);
            } else if (char1 === "d") {
                if (url.indexOf("data:image") === 0) return url;
            } else if (char1 === "/") {
                return url;
            }
            return (base || basePath) + url;
        }

这里可以回答一个疑问:
Q:我的UI上,有两个image,img1.skin=comp/image.png,img2.skin=uiExRes/gameTitle.png.根据资源设置,img1.skin是图集comp中的一张小图,而img2.skin是外部加载的一张单图。在set skin时,是怎么区分从图集中获取texture,还是从外部加载获取texture呢
A:参考Image.as set skin方法,Loader.getRes方法。可以看到,最终都会去Loaer.loadedMap中取。观察前述loadedMap,已经全部转化为D:/LayaWorkSpace/TestEmbedFont/bin/+url的key了。只有在atlasMap中才能看到原始的图集路径。

public function set skin(value:String):void {
    if (_skin != value) {
        _skin = value;
        if (value) {
            var source:Texture = Loader.getRes(value);
            if (source) {
                this.source = source;
                onCompResize();
            } else Laya.loader.load(_skin, 
              Handler.create(this, setSource, [_skin]), null, Loader.IMAGE,1,true,_group);
        } else {
            this.source = null;
        }
    }
}

/**
 * 获取指定资源地址的资源。
 * @param   url 资源地址。
 * @return  返回资源。
 */
public static function getRes(url:String):* {
    return loadedMap[URL.formatURL(url)];
}

2.basePath

var location:* = Browser.window.location;
var pathName:String = location.pathname;
// 索引为2的字符如果是':'就是windows file协议
pathName = pathName.charAt(2) == ':' ? pathName.substring(1) : pathName;
URL.rootPath = URL.basePath = URL.getPath(location.protocol == "file:"
? pathName : location.protocol + "//" + location.host + location.pathname);

如果部署在本地服务器上,使用192.168.198.102:8080来访问,那么

Browser.window.location

根据代码basePath=http://192.168.198.102:8080/,如果是本地文件访问:


Paste_Image.png

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,458评论 25 707
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,706评论 22 664
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,357评论 0 17
  • 周末天气不太好,便窝在家里看书,乏了便打开空间,没往下翻一会儿,一张图片便闯入眼中。然后记忆的匣子一下子被打开,那...
    泠艺萱阅读 474评论 0 0
  • 源于我曾写过的一个很矫情的句子,「所有措手不及的相遇都是久别重逢」。 在那篇浅谈大学的文章在简书火了之后,有很多朋...
    思遥阅读 503评论 5 4