使用cocos2d-x制作 Texture unpacker

  次阅读 来源:互联网(转载协议) 2015-09-28 11:08 我要评论(0)

使用cocos2d-x制作 Texture unpacker

没错,就是unpacker。

在大多数游戏包里面,可以找到很多纹理图集,他们基本上是用texture packer制作的,有plist文件和png图片组成。

如果原来的小图比较少,倒是可以自己在plist里面找名字,如果小图有几百张,那真的会找疯掉。所以今天就用cocos2d-x引擎制作了一个将纹理大图解包成一张张小图的工具。

1. 解析plist文件

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

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

const Map<:string>& SpriteFrameCache::getSpriteframes()

{

return _spriteFrames;

},>

2. 生成图片

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

1) 将SpriteFrame渲染成一张纹理

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

Sprite* pSp = Sprite::createWithSpriteFrame(pSpriteFrame /*one sprite frame*/);

RenderTexture* texture = RenderTexture::create(pSp->getContentSize().width, pSp->getContentSize().height);

texture->setName(m_savePath + tempBuf);

texture->begin();

pSp->setPosition(pSp->getContentSize()/2); //--- be careful

pSp->visit();

texture->end();

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

2) 保存为图片

Image* image = texture->newImage(true);//frame渲染出的一个texture

if (image)

{

image->saveToFile("filename.png", false);

}

CC_SAFE_DELETE(image);

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

3. 除去无效图片

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

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

plist中的配置:

1002_effup/0000frame{{440,56},{1,1}}offset{-479.5,319.5}rotatedsourceColorRect{{0,0},{1,1}}sourceSize{960,640}1002_effup/0001frame{{440,56},{1,1}}offset{-479.5,319.5}rotatedsourceColorRect{{0,0},{1,1}}sourceSize{960,640}

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

2) 去除重复的图片

plist中的配置:

1002_effup/0010frame{{440,56},{102,88}}offset{5,7}rotatedsourceColorRect{{363,355},{212,50}}sourceSize{960,640}1002_effup/0093frame{{440,56},{102,88}}offset{5,7}rotatedsourceColorRect{{363,355},{212,50}}sourceSize{960,640}

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

那么如何实现呢?

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...