使用cocos2d-x制作 Texture unpacker

使用cocos2d-x制作 Texture unpacker,第1张

概述http://blog.csdn.net/songcf_faith/article/details/45971665 分类: cocos2d-x 工具 2015-05-25 17:07  94人阅读  评论(0)  收藏  举报 工具 cocos2d-x Texture packer unpacker 目录(?)[+] 使用cocos2d-x制作 Texture unpacker 没错,就是unp http://blog.csdn.net/songcf_faith/article/details/45971665
分类:cocos2d-x工具 2015-05-25 17:07 94人阅读 评论(0) 收藏 举报 工具 cocos2d-x Texture packer unpacker

目录(?)[+]

使用cocos2d-x制作 Texture unpacker

没错,就是unpacker。
在大多数游戏包里面,可以找到很多纹理图集,他们基本上是用texture packer制作的,有pList文件和png图片组成。
如果原来的小图比较少,倒是可以自己在pList里面找名字,如果小图有几百张,那真的会找疯掉。所以今天就用cocos2d-x引擎制作了一个将纹理大图解包成一张张小图的工具。


1. 解析pList文件

cocos2d-x引擎中实现了解析pList纹理的逻辑,SpriteFrameCache类。可以看到SpriteFrameCache解析pList后,使用Map<std::string,SpriteFrame*>::_spriteFrames存放这些小图。既然小图在这里面,那么我们将他们保存到文件中不就可以了吗~

SpriteFrameCache类没有提供获取_spriteFrames的接口,那么我们更改一下SpriteFrameCache类,提供一个获取该成员的接口即可:

<code  >const <span  >Map</span><span  ><</span>std<span  >::string</span>,SpriteFrame<span  >*>&</span> SpriteFrameCache<span  >::getSpriteframes</span>(){    <span  >return</span> _spriteFrames;}</code><ul  ><li >1</li><li >2</li><li >3</li><li >4</li></ul>

2. 生成图片

从SpriteFrameCache中获取到的是SpriteFrame,SpriteFrame是不能直接保存的,所以我们需要将它渲染到一张纹理上,再保存。

1) 将SpriteFrame渲染成一张纹理

由于在cocos3.x版本中渲染方式已经和2.x版本中的方式不一样了(使用渲染命令,而非2.x版本中的直接渲染),所以在生成纹理的时候需要注意一下:

   

以上代码只是添加了渲染纹理的命令,真正渲染完成这张纹理是在下一帧的时候,所以添加一个schedule,在下一帧将这个texture保存为图片。

2) 保存为图片
<code  >Image* <span  >image</span> = texture->newImage(true);  <span  >//frame渲染出的一个texture</span><span  >if</span> (<span  >image</span>){    <span  >image</span>->savetofile(<span  >"filename.png"</span>,false);}CC_SAFE_DELETE(<span  >image</span>);</code><ul  ><li >1</li><li >2</li><li >3</li><li >4</li><li >5</li><li >6</li></ul>

其实RenderTexture类提供了savetofile的接口,为什么没有直接调用?因为该接口会将图片保存在doc目录下,我想在win32上把它保存在其他磁盘。


3. 除去无效图片

由于打纹理图集的时候,添加了一下加密 *** 作,这样会导致pList文件里面解析出来会有很多无效图片(如:宽高只有1像素,多张完全一样的图片),明明有效图片只有10多张,解析出来后有几十张

1) 去除宽高只有1像素的frame

pList中的配置:

<code  ><span  ><span  ><<span  >key</span>></span>1002_effup/0000<span  ></<span  >key</span>></span><span  >dict</span>></span>    <span  >key</span>></span>frame<span  >key</span>></span>    <span  >string</span>></span></span><span  >{{440,56},{1,1}}</span><span  ><span  >string</span>></span>    <span  >key</span>></span>offset<span  >string</span>></span>{-479.5,319.5}<span  >key</span>></span>rotated<span  >false</span>/></span>    <span  >key</span>></span>sourcecolorRect<span  >string</span>></span></span><span  >{{0,0},136);">key</span>></span>sourceSize<span  >string</span>></span>{960,640}<span  >string</span>></span><span  >dict</span>></span><span  >key</span>></span>1002_effup/0001<span  >dict</span>></span></span></code><ul  ><li >1</li><li >2</li><li >3</li><li >4</li><li >5</li><li >6</li><li >7</li><li >8</li><li >9</li><li >10</li><li >11</li><li >12</li><li >13</li><li >14</li><li >15</li><li >16</li><li >17</li><li >18</li><li >19</li><li >20</li><li >21</li><li >22</li><li >23</li><li >24</li><li >25</li><li >26</li></ul>

如上这两个frame宽高都是1像素,解析出来是无用的,所以需要剔除。

2) 去除重复的图片

pList中的配置:

   

如上所以,除了frame名称,其它字段均相同,这样的图片保存一张即可。

那么如何实现呢?
既然除了名称不一样,其他都一样,我们就用其他数据生成一个key,每保存一个frame,就把它的key缓存者,以后发现有相同key的直接舍弃。

   
4. 按顺序重命名

当执行完上面第三步(删除无效、冗余图片)后,保存的每一个frame会出现不连续的情况。

如:frame0001.png过后就是frame0008.png

那么我们在保存图片的时候,就要重命名每一个frame,用m_iframesCount记录当前是第几个了,然后根据它命名即可。
需要注意的是
for (Map<std::string,SpriteFrame*>::const_iterator itor = framesMap.begin(); itor != framesMap.end(); ++itor)
遍历前要先对framesMap排序。


5. 说明

该功能已经封装为一个类,放在github上了,需要的朋友可以自己去clone一份。
https://github.com/SongCF/TextureUnpacker
使用方法:

<code  >PListTool *tool = <span  >new</span> PListTool();<span  >std</span>::<span  ><span  >vector</span><<span  >std</span>::<span  >string</span>></span> vec;vec.push_back(<span  >"Enemy.pList"</span>);vec.push_back(<span  >"1001_effup.pList"</span>);tool->addUnpackList(vec);tool->startUnpack([](){    MessageBox(<span  >"unpack finished"</span>,0); Box-sizing: border-Box;">"info"</span>);});</code><ul  ><li >1</li><li >2</li><li >3</li><li >4</li><li >5</li><li >6</li><li >7</li><li >8</li></ul>

这样就会在当前目录生成两个文件夹,存放两个pList解包出来的小图。

总结

以上是内存溢出为你收集整理的使用cocos2d-x制作 Texture unpacker全部内容,希望文章能够帮你解决使用cocos2d-x制作 Texture unpacker所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存