cocos2d-x精灵帧图片读取

有些情况下,比如从爱给网获取的精灵帧图片,没有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
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef _SPRITEFRAMEUTILS_H__
#define _SPRITEFRAMEUTILS_H__

#include<iostream>
#include "cocos2d.h"

USING_NS_CC;

class SpriteFrameUtils{
public:
static Animate* readSpriteSheet(std::string fileName, int width, int height, int row, int column);
};

#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include"SpriteFrameUtils.h"

/*
参数说明:
fileName 图片路径
width 每个序列帧的跨度
height 每个序列帧的高度
row 行数
column 列数
*/

Animate* SpriteFrameUtils::readSpriteSheet(std::string fileName, int width, int height, int row, int column)
{
Vector<SpriteFrame*> vec;

for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
vec.pushBack(SpriteFrame::create(fileName, Rect(width * j, height * i, width, height)));
}
}

Animation *animation = Animation::create();
animation->initWithSpriteFrames(vec, 0.2f, 1);
Animate *animate = Animate::create(animation);
return animate;
}

使用示例:

1
2
3
4
5
6
7
const 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中。

热评文章