第五節:精靈的使用介紹

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);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章