准備的過程
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")); }