2016年5月9日 星期一

0506 Cocos2dx sprite 三種更換圖方式


本身常用範例
auto pFrame= SpriteFrameCache::getInstance()->getSpriteFrameByName(test);
m_IconBox->setSpriteFrame(pFrame);

http://cocos2dx.logdown.com/posts/290248-cocos2dx-sprite-replace-the-picture-method

Cocos2dx - Sprite 更換圖片的方法

Cocos2dx 中 Sprite 的使用是很重要的一環, 其中關於換掉Sprite舊有圖片的做法有許多種。

網路上常見的兩種方法

  • cocos2d-x 改變精靈圖片的2種方法。
    1。[cpp] view plain copy

    1. // 首先載入貼圖集     
    2. CCSpriteBatchNode *spriteBatch=CCSpriteBatchNode::batchNodeWithFile("snake.png");    
    3. this->addChild(spriteBatch);    
    4. CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("snake.plist");    
    5. // 生成Sprite     
    6. CCSprite *headSprite=CCSprite::spriteWithSpriteFrameName("headup.png");    
    7. //需要更換圖片時     
    8. CCSpriteFrame *frame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("headleft.png");    
    9. headSprite->setDisplayFrame(frame);    
    2.[cpp] view plain copy

    1. CCSprite *my_hero = CCSprite::create("hero_a.png");  
    2.   
    3. CCTexture2D *hero_hit;  
    4.   
    5. CCSprite * temp_obj = CCSprite::create("hero_hit.png");  
    6.   
    7.  hero_hit = temp_obj->getTexture();  
    8.   
    9.   
    10. //改變my_hero的圖片  
    11.  my_hero->stopAllActions();  
    12.   
    13. my_hero->setTexture(hero_hit);  

    第一種一般在當所有的圖片在一張圖片裡面,然後按坐標,按大家截取時候使用,這時候可以把圖片資源寫入.plist中。
    第二種一般在每張圖片單獨的時候,直接更換。 


基本上網路上的做法為更換掉 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...