CCSprite是cocos2d中使用最多的类了。一般使用一张图片来创建一个精灵,图片会被加载到内存,会转换为纹理图CCTexture,从而在屏幕上显示出来。
图片介绍:
用于创建精灵,使用的一些图片。有的是一个单独的图,有是一张大图,上面有很多帧,如下图:
这是一张图,但上面可以有很多帧图片,这样使用是为了可以把图一下子加载进内存,从而比一帧一帧地加载,要快很多。
这张图片,可以转换为一个plist的配置文件,上面标明了每一帧的名字,和位置坐标 。
关于这方面,可以自行百度一下。
精灵的创建:
利用图片创建一个精灵:
//利用文件名创建一个精灵
auto mole = Sprite::create("btn_icon.png");
//设置精灵的位置
mole->setPosition(size.width/2,size.height/2);
//把精灵添加的当前场景
this->addChild(mole);
利用图片和矩形创建一个精灵:
//创建一个矩形
auto rect = Rect(2, 2, 51, 109);
//利用矩形和一个图片创建一个精灵,就是在一张大图中,抠出矩形的那一块,创建一个精灵
auto mole = Sprite::create("grossini-aliases.png", rect);
//设置精灵的位置
mole->setPosition(size.width/2,size.height/2);
//把精灵添加到当前场景
this->addChild(mole);
利用texture创建一个精灵:
//先创建一个texture,利用一图片
auto texture = Director::getInstance()->getTextureCache()->addImage("btn_icon.png");
//然后,再利用texture创建一个精灵
auto mole = Sprite::createWithTexture(texture);
//设置精灵的位置
mole->setPosition(size.width/2,size.height/2);
//把精灵添加到当前场景
this->addChild(mole);
利用texture和矩形创建一个精灵:
//先创建一个texture,利用一图片
auto texture = Director::getInstance()->getTextureCache()->addImage("grossini-aliases.png");
//创建一个矩形
auto rect = Rect(2, 2, 51, 109);
//然后,再利用texture创建一个精灵
auto mole = Sprite::createWithTexture(texture,rect);
//设置精灵的位置
mole->setPosition(size.width/2,size.height/2);
//把精灵添加到当前场景
this->addChild(mole);
SpriteBatchNode的使用:
在游戏开发中,当屏幕上的精灵太多的时候,程序性能会急剧下降,这是因为每当我们添加一个精灵的时候,GPU就要重新渲染一次,这样性能很低。
因此当有多个精灵出现的时候,如雷电游戏中的子弹,可以使用SpriteBatchNode批量加载,从而提高程序性能。
下面,我们实现一个,一次加载50个精灵,但是,在屏幕上,我们点击一次就在点击的位置出现一个精灵:
void SpriteScene::initBatch()
{
//创建一个batchNode节点,因为要在其它方法中使用,所以在头文件中声明为了全局变量
//第一个参数是文件名,第二个参数表示一次性加载多少个
batch = SpriteBatchNode::create("btn_icon.png",50);
//把batch添加到当前场景
this->addChild(batch);
}
void SpriteScene::addMole(Point p)
{
//根据纹理来创建一个精灵,而这个纹理,是从batch中得到的
mole = Sprite::createWithTexture(batch->getTexture());
//设置位置
mole->setPosition(p);
//把精灵添加到当前场景
this->addChild(mole);
}
bool SpriteScene::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event)
{
//根据触摸得到当前触摸的点
Point p = touch->getLocationInView();
//调用了添加精灵的方法,但这里,需要转换一下坐标
addMole(Director::getInstance()->convertToGL(p));
return false;
}
//这个方法要在初使化场景的时候调用。还有中间使用的size,是已经在全局声明并提前初使化了的。
void SpriteScene::registerListener()
{
//先初使化一下batch
initBatch();
//创建一个listener
auto l = EventListenerTouchOneByOne::create();
//设置listener的回调方法
l->onTouchBegan = CC_CALLBACK_2(SpriteScene::onTouchBegan, this);
//注册我们创建的listener到当前节点,用于监听事件
_eventDispatcher->addEventListenerWithSceneGraphPriority(l, this);
}
通过精灵帧SpriteFrame创建精灵:
游戏中通常使用工具,将多张图片放在一起来加载,这样可以提高性能。
可以根据单个小图片在大图片中的矩形框来显示这张小图片。
精灵帧SpriteFrame就是用来封装这张小图片的。
//创建一个矩形
auto rect = Rect(2, 2, 51, 109);
//创建一个精灵帧,第一个参数是文件名,第二个参数是个矩形
auto frame = SpriteFrame::create("grossini-aliases.png", rect);
//根据帧创建一个精灵
auto mole = Sprite::createWithSpriteFrame(frame);
//设置精灵的位置
mole->setPosition(size.width/2,size.height/2);
//把精灵添加到当前场景
this->addChild(mole);
使用Testure来的创建精灵帧,进而创建精灵:
//创建一个矩形
auto rect = Rect(2, 2, 51, 109);
//先创建一个texture,利用一图片
auto texture = Director::getInstance()->getTextureCache()->addImage("grossini-aliases.png");
//创建一个精灵帧,通过texture,和一个矩形
auto frame = SpriteFrame::createWithTexture(texture, rect);
//根据帧创建一个精灵
auto mole = Sprite::createWithSpriteFrame(frame);
//设置精灵的位置
mole->setPosition(size.width/2,100);
//把精灵添加到当前场景
this->addChild(mole);
SpriteFrameCache介绍:
SpriteFrameCache是精灵帧的缓存类,提供了一些管理精灵帧Sprite的方法。
SpriteFrameCache是单例类,实例化方法为:
static SpriteFrameCache* getInstance(void);
其它的一些重要方法:
static void purgeSharedSpriteFrameCache(void); 清除缓存
void addSpriteFramesWithFile(const char *pszPlist); 从Plist文件中添加多个CCSpriteFrame
void addSpriteFramesWithFile(const char* plist,const char* textureFileName); 使用plist和纹理文件创建多个精灵帧(新增纹理使用时,该纹理和plist文件关联在一起)
void addSpriteFramesWithFile(const char *pszPlist,CCTexture2D *pobTexture); 使用pllist和纹理创建多个精灵(新增纹理使用时,该纹理和plist文件关联在一起)
void addSpriteFrame(CCSprite *pobFrame,const char *pszframeName); 添加单帧精灵,并为精灵帧指定名称
void removeSpriteFrames(void);删除精灵
void removeUnusedSpriteFrames(void); 删除未使用的精灵帧
void removeSpriteFramesFromFile(const char* plist);根据plist删除精灵帧
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("grossini-aliases.plist");
auto frame =SpriteFrameCache::getInstance()->getSpriteFrameByName("grossini_dance_02.png");
//根据帧创建一个精灵
auto mole = Sprite::createWithSpriteFrame(frame);
//设置精灵的位置
mole->setPosition(size.width/2,100);
//把精灵添加到当前场景
this->addChild(mole);