[cocos2d-x] 关于骨骼动画替换纹理。

[cocos2d-x] 关于骨骼动画替换纹理。

      最近赶进度,累啊。

      效果:就是比如播放一个牛仔动画,那么我想在创建时候替换牛仔的帽子的纹理,替换成一只手?还是啥的等等。

      好吧,说正题,现在的项目需要一些动画特效,当然要比上家公司专业些,毕竟是做端游的,于是决定用cocos2d-x自带的骨骼动画,
正好项目也用到了cocosstudio,而里面也有动画编辑器,那么就可以由美工做好动画,程序来调用播放。由于项目的特殊性,可能需要复
用大量动画,这就需要程序在加载完动画后替换掉默认的纹理贴图,看了下CCArmature相关扩展的代码,没找到合适的方法,(- -,当
然可能没找到),咋办?还不是只有慢慢看,于是花了点时间查看加载过程的代码,最总总算找到了一个地方有机会利用。

     在CCArmature->util->CCSpriteFrameCacheHelper 中插入一个更新纹理的函数,
void CCSpriteFrameCacheHelper::updateSpriteFrame(const std::string& key, const std::string& path, CCSpriteFrame* frame)
{
      // 先移除旧的纹理 - -函数名随便写的,记不清了
      CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrame(key.c_str());
      // 在添加新的
      CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFrame(frame);
      // 这里必须更新CCSpriteFrameCacheHelper中用于缓存动画系统的 -name-texture 映射
      m_Display2ImageMap[key] = path;
}

这样在每次 create CCArmature之前先更新一下纹理,就可以用新纹理创建动画了
原理相对简单,在调用CCSpriteFrameCacheHelper::addSpriteFrameFromDict后helper通过动画显示属性所需要的纹理名映射到SpriteFrame,
而动画系统本身做了优化采用CCTextureAtlas渲染,而并不是直接使用SpriteFrame,SpriteFrame仅仅提供一些纹理的坐标信息数据而已,那么必然会
记录一张播放时使用的纹理,这个路劲就记录到m_Display2ImageMap中,于是在创建之前就可以趁机修改这个映射从而达到替换某个部位纹理的作用。
    当然可能有些遗漏难免,不过大概就是意思。

你可能感兴趣的:([cocos2d-x] 关于骨骼动画替换纹理。)