關於Cocos2d-x中打包圖集和使用方法


准備的過程

1.打開TextruePacker軟件

2.把游戲中要使用的圖片拖到TextruePacker里面,TextruePacker會自動幫我們排序,讓所有小圖變成一個大圖

3.點擊Publish-會輸出兩個文件

 MyTexture.plist  //里面記錄了所有小圖在大圖中的位置和屬性,cocos可以根據這些信息在MyTexture.png大圖中找到所需要的小圖

 MyTexture.png  //一張容納了所有小圖的大圖

4.在GameScene.cpp的init方法里面寫

 //加載plist文件到一個精靈幀緩存中
 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("MyTexture.plist");

 

 

 

開始使用

1.在對象類的init方法中使用,根據小圖的名字在精靈幀緩存的大圖中找到小圖並且賦予Star對象紋理圖案,這個和setTexture("star.png");是一樣的效果,但是setTexture("star.png");每次都要去原文件里面找,而initWithSpriteFrameName("star.png");是直接從緩存中取,效率更高,速度更快。初始化的時候才能用這個。

 bool Star::init(){
   Sprite::init();
 
   //setTexture("star.png");
   initWithSpriteFrameName("star.png");
 
 }

 

2.創建精靈節點的時候使用

//創建一顆子彈
auto bullet = Sprite::createWithSpriteFrameName("bullet1.png");

 

3.設置精靈節點的時候使用(最常用)

 myBedHero->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("h_1.png"));

 

4.在幀動畫中使用,SpriteFrameCache::getInstance()是獲得這個緩存精靈幀對象(類似一個大圖)

 //創建行走的幀動畫
 Animation * animation = Animation::create();
 //animation->addSpriteFrameWithFile("s_1.png");
 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("s_1.png"));
 //animation->addSpriteFrameWithFile("s_2.png");
 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("s_2.png"));
 //animation->addSpriteFrameWithFile("s_3.png");
 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("s_3.png"));
 //animation->addSpriteFrameWithFile("s_4.png");
 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("s_4.png"));
 //animation->addSpriteFrameWithFile("s_5.png");
 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("s_5.png"));
 //animation->addSpriteFrameWithFile("s_6.png");
 animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("s_6.png"));
 animation->setDelayPerUnit(0.1f);
 animation->setRestoreOriginalFrame(true);
 //設置動畫型的動作
 auto animate = Animate::create(animation);
 myHero->runAction(RepeatForever::create(animate));

 

5.播放動畫時使用,setSpriteFrame();感覺和setTextrue();差不多

//播放受傷動畫
SpriteFrame *hurt = nullptr;
SpriteFrame *old = nullptr;
switch (m_planeType)
{
     case Enemy2:
       hurt = SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy2_hit.png");
       old = SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy2.png");
       break;
     case Enemy3:
       hurt = SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy3_hit.png");
       old = SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy3_n1.png");
       break;
     case Enemy4:
       hurt = SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy3_hit.png");
       old = SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy3_n2.png");
       break;
}
 
auto setHurtImg = CallFunc::create([this, hurt](){
     this->setSpriteFrame(hurt);
     });
 
auto setOldImg = CallFunc::create([this, old](){
     this->setSpriteFrame(old);
     });
 
auto hurtAction = Sequence::create(setHurtImg, DelayTime::create(0.2), setOldImg, nullptr);
 
this->stopAllActions();
this->runAction(hurtAction);

 

6.放進精靈幀數組中

Vector<SpriteFrame*> m_blowframes; //存放爆炸紋理精靈幀,.h文件里面定義
if (planetype == EnemyPlaneType::Enemy1) 
{
    m_blowframes.pushBack(SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy1_down1.png"));
    m_blowframes.pushBack(SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy1_down2.png"));
    m_blowframes.pushBack(SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy1_down3.png"));
    m_blowframes.pushBack(SpriteFrameCache::getInstance()->getSpriteFrameByName("enemy1_down4.png"));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM