2012-10-14 101 views
4

在cocos2d-x中,如何更改sprite使用的png?更改sprite使用的精靈

下面的工作,但它似乎有點longwinded,我想知道是否有一個替代品,防止我不得不打電話new

// create sprite with original png 
m_pSpr = CCSprite::create("1.png"); 
m_pSpr->setPosition(ccp(100, 100)); 
this->addChild(m_pSpr); 

// now change the png that is used by the sprite 

// new image from png file 
CCImage* img = new CCImage(); 
img->initWithImageFile("2.png", CCImage::kFmtPng); 

// new texture from image 
CCTexture2D* tex = new CCTexture2D(); 
tex->initWithImage(img); 

// finally change texture of sprite 
m_pSpr->setTexture(tex); 

回答

5

將你的精靈包裝成一個spritesheet,然後使用CCSprite的setDisplayFrame()。

// make sure the spritesheet is cached 
auto cacher = CCSpriteFrameCache::sharedSpriteFrameCache(); 
cacher->addSpriteFramesWithFile("Spritesheet.plist"); 

// create the sprite 
m_pSpr = CCSprite::create("1.png"); 

// set it's display frame to 2.png  
CCSpriteFrame* frame = cacher->spriteFrameByName("2.png"); 
if(frame) 
    m_pSpr->setDisplayFrame(frame); 
+0

工作正常,這是否意味着它加載實際spritesheet進入內存只有一次,然後如果我使用2.png,就像你演示的那樣,它只會進入已經存在於內存中的spritesheet的紋理,因此它不需要再次從磁盤讀取文件?因此,如果我說,多次交換1和2,它將永遠不需要從磁盤重新讀取它們中的任何一個(如果我還將1.png的調用更改爲spriteFrameByName? – Ben

+2

是的,紋理將被加載到內存只有一次,所有的精靈都在內部使用精靈幀,所有的精靈幀都有指向內存紋理的指針,幾個精靈將使用相同的紋理。 – Morion

2

您不應該爲單個精靈使用setTexture方法。如果你將精靈集成到地圖集(例如,單個紋理,例如2048x2048像素,裏面有許多不同的幀,這可以減少內存),該方法將爲您的精靈設置整個巨大的紋理。使用setDisplayFrame代替

1

你可以,但是Morion說的是正確的,儘量避免使用下面的代碼,因爲它很貴。嘗試使用TexturePacker並處理Sprite幀是個不錯的主意。

yourSprite->setTexture(CCTextureCache::sharedTextureCache()->addImage("2.png")); 
+0

'yourSprite->的SetTexture(導演::的getInstance() - > getTextureCache() - > addImage(actualCakePopPath));'對了cocos2d-x-3.1 – Narek