cocos2dx中png合并资源工具

cocos2dx中png合并资源工具,第1张

概述</pre>    工具功能;</p><p>           把琐碎的图片合并到一个文件中,减小文件的体积,同时在使用文件的时候减少io *** 作,并使用zlib进行压缩</p><p>    实现原理</p><p>         索引文件夹下面的所有资源,按规则依次写入一个文件中,并压缩</p><p> 文件格式:</p><p>        文件格式分为3块:</p><p><pre name="c
</pre>  工具功能;</p><p>     把琐碎的图片合并到一个文件中,减小文件的体积,同时在使用文件的时候减少io *** 作,并使用zlib进行压缩</p><p>  实现原理</p><p>    索引文件夹下面的所有资源,按规则依次写入一个文件中,并压缩</p><p> 文件格式:</p><p>    文件格式分为3块:</p><p><pre name="code" >第一块为头文件信息,只写一次typedef struct _ccpfileInfo{    uint32_t version;    uint32_t fileCount;//所有文件数量}ccpfileInfo;
第二块为索引文件信息,数量为fileCounttypedef struct _ccpDataInfo{    char name[Kfilename_LEN];//文件的名字 ui/aa/bb    uint64_t offset;//在文件中的开始位置    uint64_t size;    char md5[KMD5_LEN];//md5码    _ccpDataInfo(){}    _ccpDataInfo(const char *name,uint64_t offset,uint64_t size,const char*md5){        strcpy(this->name,name);        this->offset = offset;        this->size   = size;        strcpy(this->md5,md5);    }}ccpDataInfo;第三块为文件信息,数量也为fileCount


同时在项目中需要一个解析器来解压缩文件,并加载到内存中,以下方法就是把zip解压到documents

//expand zip to documentsvoID mfpCache::expand(const char *zipfile){    std::string fromPath   = fileUtils::getInstance()->fullPathForfilename(zipfile);    std::string topath     = fileUtils::getInstance()->getWritablePath();    std::string newfilename= ReplaceString(zipfile,".zip","");    std::string newfilePath= topath +"/"+newfilename;    //exist    if (0 == access(newfilePath.c_str(),0)) {        //alread exist    }else{       assert(unCompress(newfilePath.c_str(),fromPath.c_str()));    }        //open it,only read    m_bFd =fopen(newfilePath.c_str(),"r");    if(m_bFd){        //index file        ccpfileInfo fileInfo;        memset(&fileInfo,KCCP_fileINFO_LEN);        fread(&fileInfo,KCCP_fileINFO_LEN,1,m_bFd);        for (int i=0; i < fileInfo.fileCount; ++i) {            ccpDataInfo data;            fread(&data,KCCP_DATAINFO_LEN,m_bFd);            m_dataMap.insert(std::make_pair(data.name,data));        }    }else{        assert(m_bFd);    }}

把图片加入到内存中
voID mfpCache::addImage(const char *file){    // npc/1.png 50702 23801075 aaa    uint64_t size = 0;    unsigned char *data = (unsigned char *)this->getBlockData(file,&size);    if (data !=nullptr) {        Image *image = new Image();        image->initWithImageData((unsigned char*)data,size);        Director::getInstance()->getTextureCache()->addImage(image,file);        CC_SAFE_DELETE(image);    }else{        assert(0);    }}

把pList和图片同时加入到内存中,这里需要把SpriteFrameCache中的addSpriteFramesWithDictionary方法改成publish的
voID mfpCache::addPList(const char *file){    std::string png = ReplaceString(file,".pList",".png");    ValueMap map;    uint64_t size = 0;    char *data = this->getBlockData(file,&size);    parseXml(data,size,map);    addImage(png.c_str());    Texture2D *texture= Director::getInstance()->getTextureCache()->getTextureForKey(png);    SpriteFrameCache::getInstance()->addSpriteFramesWithDictionary(map,texture);}
有了这些方法,在游戏中的调用就是
<span >	</span>mfpCache::getInstance()->expand("data.bin.zip");    mfpCache::getInstance()->addPList("ui.pList");    Sprite *spr1 = Sprite::createWithSpriteFramename("ui/+30s.png");    spr1->setposition(Point(100,100));    addChild(spr1);    mfpCache::getInstance()->addImage("ken.png");    Sprite *spr2 = Sprite::create("ken.png");    spr2->setposition(Point(200,200));   
总结

以上是内存溢出为你收集整理的cocos2dx中png合并资源工具全部内容,希望文章能够帮你解决cocos2dx中png合并资源工具所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1033632.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存