2013-04-11 67 views
1

到目前爲止,我可以追蹤到我在cocos2dx應用程序中遇到的每一個錯誤/崩潰,但現在我感覺自己很愚蠢。 我有一個CCSprite指針數組,我想做的是當玩家有x分數時,從緩存中改變它的顯示幀。Cocos2d-x CCSprite-> setDisplayFrame AccessViolation crash

從plist文件中讀取所有精靈幀,並且精靈在那裏並正在工作,因爲在嘗試切換到新幀之前,我可以看到它沒有任何問題。 「background.png」是一個有效的精靈框架名稱,因爲我用它來創建實際的精靈。

這行工作正常(或至少它似乎工作)

CCSpriteFrame* frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("background.png"); 

問題是這一行:

for (int c = 0; c < sizeof(mBackground)/sizeof(CCSprite*); c++){ 
    mBackground[c]->setDisplayFrame(frame); 
} 

這其中也崩潰了:

CCSpriteFrame* frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("background.png"); 
mBackground[0]->setDisplayFrame(frame); 

我用完了想法,我非常感謝任何幫助。

+0

找到可能的問題: 'CCSpriteFrameCache :: sharedSpriteFrameCache() - > spriteFrameByName( 「background.png」)' 返回空指針。根據文檔,如果找不到該名稱,則返回nil。有趣的是,我使用完全相同的名稱來創建對象。 – LugaidVandroiy 2013-04-11 09:37:48

+0

如果您使用spriteWithFile構造函數創建sprite,那麼如果在那裏沒有這樣的spriteframe,它會將所需的spriteframe添加到緩存中。如果您嘗試從緩存中獲取精靈幀,它將僅返回空指針。 – Morion 2013-04-11 16:40:44

回答

2

確保圖像存在於緩存中。如果不存在,則首先將spriteframe加載到緩存。在改變顯示框之前,還要將mBackground [0]添加到父項。

if(mBackground[0] && frame) 
{ 
    mBackground[0]->setDisplayFrame(frame); 
}