使用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!

人工智能实验室
相关文章相关文章
  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

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

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...