有些情况下,比如从爱给网获取的精灵帧图片,没有plist文件,也没有TiledMap文件,只有png图片,这种情况下如何读取精灵帧图片呢?我翻看了cocos2d-x 3.9的官方api文档,找到了SpriteFrame这个类,其中有一个类方法static SpriteFrame* create ( const std::string & filename,const Rect & rect )
,这个方法的功能是“使用指定的图片文件与矩形区域创建一个 SpriteFrame。 这个方法假设 SpriteFrame 没有进行修剪。”
主要就是使用这个方法来实现直接对png精灵帧图片的读取。我封装成了一个单一职能的类SpriteFrameUtils。类定义和实现如下:
code is here:
1 | #ifndef _SPRITEFRAMEUTILS_H__ |
1 | #include"SpriteFrameUtils.h" |
使用示例:1
2
3
4
5
6
7const string test = "test.png";
Sprite *sprite = Sprite::create();
addChild(sprite);
sprite->setPosition(Vec2(visibleSize.width / 2.0f, visibleSize.height/2.0f));
Animate *animate = SpriteFrameUtils::readSpriteSheet(test, 192, 192, 20, 5);
sprite->runAction(RepeatForever::create(animate));
扩展:需要实现一个SpriteFrameManager类来管理由png图片生成的一个系列一个系列的SpriteFrame,如果使用cocos2d-x为我们提供的SpriteFrameCache来管理很不方便,尤其在管理很多系列SpriteFrame的时候。这个SpriteFrameManager的功能与SpriteFrameCache类似,都是以键值对的形式存储SpriteFrame,只不过SpriteFrameManager存取的是一个系列的SpriteFrame。相应的,SpriteFrameUtils在readSpriteSheet方法中,要将vec以键值对的方式添加到SpriteFrameManager中。