紋理緩存(TextureCache)。使用紋理緩存能夠建立紋理對象,在上一節咱們已經用到了。html
精靈幀緩存(SpriteFrameCache)。可以從精靈表中建立精靈幀緩存,而後再從精靈幀緩存中得到精靈對象,反覆使用精靈對象時候,使用精靈幀緩存能夠節省內存消耗。設計模式
動畫緩存(AnimationCache)。動畫緩存主要用於精靈動畫,精靈動畫中的每一幀是從動畫緩存中獲取的。緩存
這一個節咱們主要介紹精靈幀緩存(SpriteFrameCache),要使用精靈幀緩存涉及到的類有:SpriteFrame和SpriteFrameCache。使用SpriteFrameCache建立精靈對象的主要代碼以下:函數
[html] view plaincopy動畫
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist"); ① this
to mountain1 =Sprite::createWithSpriteFrameName("mountain1.png"); ② spa
上述代碼第①行是經過SpriteFrameCache建立精靈幀緩存對象,它是採用單例設計模式進行設計的,getInstance()函數能夠得到SpriteFrameCache單一實例,addSpriteFramesWithFile函數是將精靈幀添加到緩存中,其中SpirteSheet.plist是座標文件。咱們能夠屢次調用addSpriteFramesWithFile函數添加更多的精靈幀到緩存中。.net
第②行代碼Sprite::createWithSpriteFrameName("mountain1.png")是經過Sprite的createWithSpriteFrameName函數建立精靈對象,其中的參數mountain1.png是SpirteSheet.plist是座標文件中定義的精靈幀名(見SpirteSheet.plist文件代碼中的第②行)。設計
下面咱們會經過一個實例介紹精靈幀緩存使用,這個實例以下圖所示,在遊戲場景中有背景、山和英雄三個精靈。code
在HelloWorldScene.cpp實現的init函數代碼以下:
[html] view plaincopy
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
autobackground = Sprite::create("background.png"); ①
background->setAnchorPoint(Point::ZERO);
this->addChild(background,0);
SpriteFrameCache*frameCache = SpriteFrameCache::getInstance(); ②
frameCache->addSpriteFramesWithFile("SpirteSheet.plist"); ③
auto mountain1 =Sprite::createWithSpriteFrameName("mountain1.png"); ④
mountain1->setAnchorPoint(Point::ZERO);
mountain1->setPosition(Point(-200,80));
this->addChild(mountain1,0);
SpriteFrame*heroSpriteFrame = frameCache->getSpriteFrameByName("hero1.png"); ⑤
Sprite*hero1 = Sprite::createWithSpriteFrame(heroSpriteFrame); ⑥
hero1->setPosition(Point(800,200));
this->addChild(hero1,0);
return true;
}
上述代碼第①行是建立一個背景精靈對象,這個背景精靈對象,並非經過精靈緩存建立的,而是直接經過精靈文件直接建立的,事實上咱們徹底也能夠將這個背景圖片放到精靈表中。
第②行代碼是得到精靈緩存對象。第③行代碼是經過addSpriteFramesWithFile函數爲精靈緩存中添加精靈幀。在前面的介紹中咱們使用一條語句SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist")替代第②和第③行兩條語句。在這裏咱們分紅兩條語句是由於後面咱們還有使用frameCache變量。
第④行代碼是使用Sprite 的createWithSpriteFrameName函數建立精靈對象,其中的參數是精靈幀的名字。
代碼第⑤~⑥行是使用精靈緩存建立精靈對象的另一種函數,其中第⑤行代碼是使用精靈緩存對象frameCache的getSpriteFrameByName函數建立SpriteFrame對象,SpriteFrame對象就是「精靈幀」對象,事實上在精靈緩存中存放的都是這種類型的對象。第⑥行代碼是經過精靈幀對象建立。第⑤和⑥行使用精靈緩存方式主要應用於精靈動畫時候,相關的知識咱們將在精靈動畫部分介紹。
精靈緩存再也不使用後忘記清空或移除相關精靈幀,不然若是有相同名稱的精靈幀時候,就會出現一些奇怪的現象。清空或移除精靈幀的緩存函數以下:
[html] view plaincopy
pvoid removeSpriteFrameByName(conststd::string & name)。指定具體的精靈幀名移除。
pvoid removeSpriteFrames()。指定清空精靈緩存。
pvoidremoveSpriteFramesFromFile(const std::string & plist)。指定具體的座標文件移除精靈幀。
pvoid removeUnusedSpriteFrames()。移除沒有使用的精靈幀。
若是爲了防止該場景中的精靈緩存對下一個場景產生影響,咱們能夠在當前場景所在層的onExit函數中調用這些函數,相關代碼以下:
[html] view plaincopy
void HelloWorld::onExit()
{
Layer::onExit();
SpriteFrameCache::getInstance()->removeSpriteFrames();
}
onExit()函數是層退出時候回調的函數,與init函數相似都屬於層的生命週期中的函數。咱們要在h文件中定義,在cpp文件中聲明。HelloWorld.h文件的相關代碼以下:
[html] view plaincopy
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
class HelloWorld : public cocos2d::Layer
{
public:
… …
virtualbool init();
//退出Layer回調函數
virtualvoid onExit();
… …
CREATE_FUNC(HelloWorld);
};
#endif // __HELLOWORLD_SCENE_H__
固然精靈緩存清除工做也能夠放到下一個場景建立時候,也就是下一個場景所在層的init函數中實現,相關代碼以下:
bool HelloWorld::init()
{
… …
SpriteFrameCache::getInstance()->removeSpriteFrames();
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("SpirteSheet.plist");
… …
}