CocosCreator動(dòng)態(tài)加載texturepacker圖集并解析

本文texturepacker導(dǎo)出的圖集文件為.plist和.png格式,代碼部分為T(mén)S缭嫡。

關(guān)于動(dòng)態(tài)加載圖集資源的方法痛侍,我介紹兩種钥弯,第一種是遠(yuǎn)程加載.plist和.png兩個(gè)文件糊饱,第二種是將.plist文件預(yù)設(shè)在屬性檢查器垂寥,將.png遠(yuǎn)程加載或者動(dòng)態(tài)加載(動(dòng)態(tài)加載是資源放在打包后的resources文件夾里)。

先說(shuō)明第一種方式:
第一步:遠(yuǎn)程加載.plist和.png文件

private loadingAtlasPlist(): void {
    let self:any = this;
    let imageUrlStr: string = "https://...xxx.plist";
    cc.loader.load(imageUrlStr, function (error: any, resource: any) {
        if (error != null || resource == null) {
            console.log("加載.plist文件失敗");
            console.log(error);
            console.log(resource);
        }else {
            self.atlasPlist = resource;
        }
    });
}
private loadingAtlasFrame(): void {
    let self: any = this;
    let imageUrlStr: string = "https://...xxx.png";
    cc.loader.load(imageUrlStr, function (error: any, resource: any) {
        if (error != null || resource == null) {
            console.log("加載.png文件失敗");
            console.log(error);
            console.log(resource);
        }else {
            self.atlasFrame = resource;
        }
    });
}

第二步:解析.plist數(shù)據(jù)另锋,創(chuàng)建碎圖的精靈幀

// 碎圖的文件名+后綴
let imageStr: string = "xxx.png";
// 獲取.plist文件中關(guān)于此圖的圖片信息
let frameDataObj: any = this.atlasPlist.frames[imageStr];
// 圖片矩形信息
let rect: cc.Rect = Tools.GetFrameData(frameDataObj.frame);
// 圖片的原始大小
let size: cc.Size = Tools.GetSizeData(frameDataObj.sourceSize);
// 圖片合圖時(shí)的裁剪偏移
let offset: cc.Vec2 = Tools.GetOffsetData(frameDataObj.offset);
// 創(chuàng)建此圖的精靈幀
let newFrame: cc.SpriteFrame = new cc.SpriteFrame();
newFrame.setTexture(this.atlasFrame, rect, frameDataObj.rotated, offset, size);

附上上面所需的三個(gè)方法

public static GetFrameData = function (str: string) {
    // 13是這個(gè)rect結(jié)構(gòu)至少要有的字符串長(zhǎng)度滞项,例如{{1000,389},{1022,768}}
    if (str.length < 13) {
        console.log("---解析plist的frame rect,數(shù)據(jù)錯(cuò)誤-----");
        return null;
    }
    let newStr: string = str;
    newStr = newStr.slice(2);
    newStr = newStr.slice(0, newStr.length - 2);
    let newList_0:string[] = newStr.split('},{');
    let newList_1: string[] = newList_0[0].split(",");
    let newList_2: string[] = newList_0[1].split(",");
    if (newList_1.length < 2 || newList_2.length < 2) {
        Tools.log("---解析plist的frame rect夭坪,字符串?dāng)?shù)據(jù)錯(cuò)誤-----");
        return null;
    }
    return cc.rect(parseInt(newList_1[0]), parseInt(newList_1[1]), parseInt(newList_2[0]), parseInt(newList_2[1]));
};
public static GetSizeData = function (str: string) {
    // 5是這個(gè)size結(jié)構(gòu)至少要有的字符串長(zhǎng)度文判,例如{64,60}
    if (str.length < 5) {
        console.log("---解析plist的size,數(shù)據(jù)錯(cuò)誤-----");
        return null;
    }
    let newStr: string = str;
    newStr = newStr.slice(1);
    newStr = newStr.slice(0, newStr.length - 1);
    let newList_0: string[] = newStr.split(',');
    if (newList_0.length < 2) {
        console.log("---解析plist的size室梅,字符串?dāng)?shù)據(jù)錯(cuò)誤-----");
        return null;
    }
    return cc.size(parseInt(newList_0[0]), parseInt(newList_0[1]));
};
public static GetOffsetData = function (str: string) {
    // 5是這個(gè)offset結(jié)構(gòu)至少要有的字符串長(zhǎng)度戏仓,例如{22,-24}
    if (str.length < 5) {
        console.log("---解析plist的offset潭流,數(shù)據(jù)錯(cuò)誤-----");
        return null;
    }
    let newStr: string = str;
    newStr = newStr.slice(1);
    newStr = newStr.slice(0, newStr.length - 1);
    let newList_0: string[] = newStr.split(',');
    if (newList_0.length < 2) {
        console.log("---解析plist的offset,字符串?dāng)?shù)據(jù)錯(cuò)誤-----");
        return null;
    }
    return cc.v2(parseInt(newList_0[0]), parseInt(newList_0[1]));
};

現(xiàn)在說(shuō)明第二種方式:
先將.plist文件預(yù)設(shè)在屬性檢查器柜去,腳本組件中添加類(lèi)似如下:

@property(cc.SpriteAtlas)
atlasPlist: cc.SpriteAtlas =null;

再遠(yuǎn)程加載.png文件(動(dòng)態(tài)加載resources文件就不上代碼了)

private loadingAtlasFrame(): void {
    let self: any = this;
    let imageUrlStr: string = "https://...xxx.png";
    cc.loader.load(imageUrlStr, function (error: any, resource: any) {
        if (error != null || resource == null) {
            console.log("加載.png文件失敗");
            console.log(error);
            console.log(resource);
        }else {
            self.atlasFrame = resource;
        }
    });
}

最后解析.plsit文件

// 碎圖的文件名+后綴
let imageStr: string = "xxx.png";
// 獲取.plist文件中關(guān)于此圖的圖片信息
let frameDataObj: any = this.atlasPlist.getSpriteFrame(imageStr);
// 創(chuàng)建此圖的精靈幀
let newFrame: cc.SpriteFrame = new cc.SpriteFrame();
newFrame.setTexture(this.atlasFrame, frameDataObj.getRect(), frameDataObj.isRotated(), frameDataObj.getOffset(), frameDataObj.getOriginalSize());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拆宛,隨后出現(xiàn)的幾起案子嗓奢,更是在濱河造成了極大的恐慌,老刑警劉巖浑厚,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件股耽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钳幅,警方通過(guò)查閱死者的電腦和手機(jī)物蝙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敢艰,“玉大人诬乞,你說(shuō)我怎么就攤上這事∧频迹” “怎么了震嫉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牡属。 經(jīng)常有香客問(wèn)我票堵,道長(zhǎng),這世上最難降的妖魔是什么逮栅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任悴势,我火速辦了婚禮,結(jié)果婚禮上措伐,老公的妹妹穿的比我還像新娘特纤。我一直安慰自己,他們只是感情好废士,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布叫潦。 她就那樣靜靜地躺著,像睡著了一般官硝。 火紅的嫁衣襯著肌膚如雪矗蕊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天氢架,我揣著相機(jī)與錄音傻咖,去河邊找鬼。 笑死岖研,一個(gè)胖子當(dāng)著我的面吹牛卿操,可吹牛的內(nèi)容都是我干的警检。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼害淤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扇雕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窥摄,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤镶奉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后崭放,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哨苛,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年币砂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了建峭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡决摧,死狀恐怖亿蒸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜜徽,我是刑警寧澤祝懂,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拘鞋,受9級(jí)特大地震影響砚蓬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盆色,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一灰蛙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隔躲,春花似錦摩梧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浑吟,卻和暖如春笙纤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背组力。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工省容, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燎字。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓腥椒,卻偏偏與公主長(zhǎng)得像阿宅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笼蛛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361