关于CCArmature加载时因为plist中含有相同名称的图片导致碰撞框被冲掉的解决办法。

来源:互联网 发布:分期付款算法 编辑:程序博客网 时间:2024/04/27 17:59
很久没有写博客了。


我发现坚持每周写博客真的很难。生活中总是有这样那样的事情成为你不坚持写博的理由,而我在写这篇博客时实际上是在上班。。。。。。


好了言归正传,今天要说的这个问题可能大家都遇到过了。这里先重现一下场景,你打算做一个动作很多的主角,然后你发现将主角的所有动作做到一个工程文件里有些牵强,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开发经验。
0 0
原创粉丝点击