在cocos2d-x中,精灵处理有关的类共有4个:
精灵类CCSprite、精灵批处理类CCSpriteBatchNode、精灵帧类CCSpriteFrame和精灵帧缓存类CCSpriteFrameCache
在精灵类CCSprite中,创建精灵的方式有:
static Sprite* create(const std::string& filename);
static Sprite* createWithTexture(Texture2D *texture);
static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);
static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);
第一个函数是利用图片文件的文件名,第二个是利用图片纹理信息创建精灵,第三和第四个是利用精灵帧和精灵帧名来创建函数。通过查看各个函数的源代码可以发现,这四个函数最终都会进入函数
bool Sprite::initWithTexture(Texture2D *texture,const Rect& rect,bool rotated)
实际上这四个方法最终都是利用图像的纹理信息来创建精灵。
精灵批处理类CCSpriteBatchNode:它可以一次性渲染多副图像,可以降低图像渲染的次数,防止渲染次数过多造成的延时。
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("black.png",1000);
batchNode->setPosition(CCPointZero);
this->addChild(batchNode);
for (int i = 0; i<1000; ++i){
float x = CCRANDOM_0_1()*visibleSize.width;
float y = CCRANDOM_0_1()*visibleSize.height;
CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());
testIcon->setPosition(ccp(x,y));
batchNode->addChild(testIcon);
}
效果图如下:
精灵帧类CCSpriteFrame构造的对象可以是图像的某一部分,可以通过构造一系列精灵帧对象形成动画,常与精灵帧缓存类CCSpriteFrameCache一起使用来形成动画。
精灵帧缓存类CCSpriteFrameCache使用单例模式,通过读入plist文件来快速加载精灵帧,plist文件记录了每幅图像在合成的大图像中的信息,这样可以一次渲染多幅图像。
CCSpriteFrameCache * cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("ghosts.plist");
//利用plist文件中的图片信息可以一次渲染所有图片
char str[20] = { 0 };
for (int i =1; i<=4; ++i){
float x = CCRANDOM_0_1()*visibleSize.width;
float y = CCRANDOM_0_1()*visibleSize.height;
sprintf(str,"icon%d.gif",i);
CCSprite *sp = CCSprite::createWithSpriteFrameName(str);
sp->setPosition(x,y);
this->addChild(sp);
}
效果图如下:
该类还可以得到一系列图片构成的一组精灵帧,利用这些精灵帧和CCAnimation类中的函数可以形成动画。
Vector< SpriteFrame* > sfme = Vector< SpriteFrame* >::Vector(4);
char str[20] = {0};
for( int i = 1 ; i <=4 ; ++i )
{
sprintf(str,i);
SpriteFrame *fname = cache -> spriteFrameByName( str );
sfme.pushBack( fname );
}
CCAnimation *animation = CCAnimation::createWithSpriteFrames( sfme,0.05f );
sp -> runAction ( CCAnimate::create(animation ));