关于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开发经验。
我发现坚持每周写博客真的很难。生活中总是有这样那样的事情成为你不坚持写博的理由,而我在写这篇博客时实际上是在上班。。。。。。
好了言归正传,今天要说的这个问题可能大家都遇到过了。这里先重现一下场景,你打算做一个动作很多的主角,然后你发现将主角的所有动作做到一个工程文件里有些牵强,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
- 关于CCArmature加载时因为plist中含有相同名称的图片导致碰撞框被冲掉的解决办法。
- ubuntu 终端大量信息 导致信息被冲掉的解决办法
- 将两个含有相同名称的程序库以‘*’形式同时导入--导致冲突
- 关于CCArmature的内存泄漏
- java项目中依赖的jar包中含有相同类时的加载顺序(按照)
- React-native 中因为计时器导致的异常解决办法
- 使用httpclient下载图片时,url中含有中文字符,导致下载失败的解决方法
- 因为注释导致的页面加载错误
- VC中关于路径中含有空格问题的解决办法
- 关于抽象类和接口中含有相同方法的实现的一点思考
- URL地址中含有点号导致参数解析错误的解决办法
- Android 数据库中读取图片名称加载相应的资源
- MYSQL因为排序规则不同导致的问题的解决办法
- webpack打包过程中因为图片的路径导致的问题
- 引用Three20框架,如果加载网络的图片过大导致图片编译器不执行的解决办法
- vtkPolyData中GetPoint函数冲掉上一个数据的问题
- 具有相同的名称
- 关于Android项目打包过程中因为id重名导致的无法打包的问题
- Poj2388_Who's in the Middle
- Oracle的主要进程简要
- Codeforces Round #328 (Div. 2)A. PawnChess
- Why Floating-Point Numbers May Lose Precision
- 解决cocos2dx CCArmature动画在部分型号的安卓手机上播放不正常的问题
- 关于CCArmature加载时因为plist中含有相同名称的图片导致碰撞框被冲掉的解决办法。
- ubuntu 改时区
- 黑马程序员视频加源码
- eclipse for android安装过程
- Codeforces Round #328 (Div. 2)B. The Monster and the Squirrel
- Day2(11.1):(2)选择合适的数据类型
- [深入理解Java虚拟机]第十一章 程序编译与代码优化-晚期(运行期)优化
- 一个典型的JDBC小程序
- spring集成jedis支持redis3.0集群