關於CCArmature加載時因爲plist中含有相同名稱的圖片導致碰撞框被沖掉的解決辦法。

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/crane406/article/details/49691385
很久沒有寫博客了。


我發現堅持每週寫博客真的很難。生活中總是有這樣那樣的事情成爲你不堅持寫博的理由,而我在寫這篇博客時實際上是在上班。。。。。。


好了言歸正傳,今天要說的這個問題可能大家都遇到過了。這裏先重現一下場景,你打算做一個動作很多的主角,然後你發現將主角的所有動作做到一個工程文件裏有些牽強,cocostudio垃圾的體驗會讓你用數秒鐘時間切換到一個Animation。所以後來我們決定分成兩個工程,但是使用相同的圖片文件。

好,問題開始了,現在主角分成兩個工程,一個正常模式,一個狂暴模式,你分別爲正常與狂暴添加了自己的攻擊框,正常的有正常的攻擊框,狂暴的有狂暴的攻擊框。當你將文件導入工程並運行的時候,你會發現不是正常的沒有攻擊,就是狂暴的沒有攻擊。


爲什麼會這樣?我們來看一段代碼。


void CCArmatureDataManager::addTextureData(const char *id, CCTextureData *textureData, const char *configFilePath)
{
if(m_pTextureDatas)
{
if (CCRelativeData *data = getRelativeData(configFilePath))
{
data->textures.push_back(id);
}


m_pTextureDatas->setObject(textureData, id);
}
}


這是框架中的原版代碼,從代碼中看,CCArmature是使用了一個數據管理類來管理數據,所有的圖片信息被儲存在同一個容器中。而且我們兩個json文件使用的是同一張圖片,其中的文件名是相同的。也就是說一個有碰撞信息的圖片可能被另一個相同的沒有碰撞信息的圖片替換掉。


這顯然不是我們想要的。


所以將代碼修改成:


void CCArmatureDataManager::addTextureData(const char *id, CCTextureData *textureData, const char *configFilePath)
{
if(m_pTextureDatas)
{
if (CCRelativeData *data = getRelativeData(configFilePath))
{
data->textures.push_back(id);
}


CCObject * object = m_pTextureDatas->objectForKey(id);
if (object == NULL) {
m_pTextureDatas->setObject(textureData, id);
} else {
CCTextureData * temp = (CCTextureData *)object;
if (temp->contourDataList.count() == 0) {


} else {
for (int i = 0; i < temp->contourDataList.count(); i++) {
textureData->addContourData(temp->getContourData(i));
}
}


m_pTextureDatas->setObject(textureData, id);
}
}
}


程序中會判斷是否已經存在同名的圖片信息,然後判斷他是否有碰撞框,如果有則將他的碰撞框複製給需要添加的紋理信息,這可能有一些不妥,但他確實能解決問題。


我會分享更多的cocos2dx開發經驗。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章