2017年12月8日 星期五

1208 Cocos2dx - Sprite 更換圖片的方法

http://cocos2dx.logdown.com/tags/%E6%9B%B4%E6%8F%9B%E5%9C%96%E7%89%87

自己程式用到的方式有

刪除舊檔
TextureCache::getInstance()->removeTextureForKey(avatarFileName); //檔名加路徑
//增加至CACHE中
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
auto pNewSprite = Sprite::create(avatarFileName); //開檔載入
if (pNewSprite != nullptr)
{
auto pFrame = pNewSprite->getSpriteFrame();
cache->addSpriteFrame(pFrame, stInfo.FileName);
}

新檔案載入

//將大頭照載入cache 中
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
auto pFrame = cache->getSpriteFrameByName(avatar);
if (pFrame == nullptr)
{ //檢查是否已經在cahce
auto pNewSprite = Sprite::create(fileName); //開檔載入
if (pNewSprite != nullptr)
{
TextureCache::getInstance()->removeTextureForKey(avatar);
//cache->addSpriteFramesWithFile(fileName);
pFrame = pNewSprite->getSpriteFrame();
cache->addSpriteFrame(pFrame, avatar);
}
}
if (pFrame != nullptr)
{
logFile(LOG_DEBUG, "Image name %s (%p)", avatar.c_str(), pFrame);
spritePersion->setSpriteFrame(pFrame);
return true;
}

 參考文件資料

網路上常見的兩種方法

基本上網路上的做法為更換掉 Sprite 中的Texture, 或者將 SpriteFrame 中的DisplayFrame 換掉。
但必須得說, 這些做法都相對麻煩, 而且就效率來說與新建一張Sprite的成本, 差距不大。
於是有些時候我會採用下面的做法。

新建一張Sprite, 將裡面的Texture貼回需要替換的Sprite


Sprite *newSprite = Sprite::create("newImage.png");  
oldSprite->setTexture(newSprite->getTexture());

  • 限制: 更換Sprite 的 Texture時, 需要注意如果是更新有相同名稱的圖檔時, 需要先將舊有的 Cache清除, 不然使用相同名稱時, 會取成舊有Cache中的 Texture檔
      Director::getInstance()->getTextureCache()->removeTextureForKey("photo.png");
    

筆者: 好處是不需要額外處理 Texture中的許多細節, 缺點則是多了一個 create 的呼叫, 在有許多圖檔建立時, App會變得很慢, 所以這種作法請千萬不要在需要一次更換很多圖檔時使用。

沒有留言:

張貼留言

cocos2dx-lua 建立滑鼠監聽

重要關鍵字  EVENT_MOUSE_SCROLL addEventListenerWithSceneGraphPriority      if IsPc() then --建立滑鼠監聽         local listener = cc.EventListenerMouse...