void CCArmature::draw()
{
if (m_pParentBone == NULL && m_pBatchNode == NULL)
{
CC_NODE_DRAW_SETUP();
ccGLBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
}
CCObject *object = NULL;
CCARRAY_FOREACH(m_pChildren, object)
{
if (CCBone *bone = dynamic_cast(object))
{
CCNode *node = bone->getDisplayRenderNode();
if (NULL == node)
continue;
switch (bone->getDisplayRenderNodeType())
{
case CS_DISPLAY_SPRITE:
{
CCSkin *skin = (CCSkin *)node;
CCTextureAtlas *textureAtlas = skin->getTextureAtlas();
CCBlendType blendType = bone->getBlendType();
if(m_pAtlas != textureAtlas || blendType != BLEND_NORMAL)
{
if (m_pAtlas)
{
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
}
}
m_pAtlas = textureAtlas;
if (m_pAtlas->getCapacity() == m_pAtlas->getTotalQuads() && !m_pAtlas->resizeCapacity(m_pAtlas->getCapacity() * 2))
return;
skin->updateTransform();
if (blendType != BLEND_NORMAL)
{
updateBlendType(blendType);
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
ccGLBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
}
}
break;
case CS_DISPLAY_ARMATURE:
{
CCArmature *armature = (CCArmature *)(node);
CCTextureAtlas *textureAtlas = armature->getTextureAtlas();
if(m_pAtlas != textureAtlas)
{
if (m_pAtlas)
{
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
}
}
armature->draw();
m_pAtlas = armature->getTextureAtlas();
}
break;
default:
{
if (m_pAtlas)
{
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
}
node->visit();
CC_NODE_DRAW_SETUP();
ccGLBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
}
break;
}
}
else if(CCNode *node = dynamic_cast(object))
{
if (m_pAtlas)
{
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
}
node->visit();
CC_NODE_DRAW_SETUP();
ccGLBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
}
}
if(m_pAtlas && !m_pBatchNode && m_pParentBone == NULL)
{
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
}
}
```
以上是CCArmature的渲染函数
现在有个问题
在骨骼动画里 建立了一个空白的骨骼(没有贴图的) 用作绑定一些特效 还有一些是绑定在有图片的骨骼上的
通过bone->addChild(pEffectNode);将特效添加进了骨骼子节点的列表中
发现特效一直播不出来 跟踪代码发现 空的骨骼没有渲染节点会跳过 那么意味着在这个骨骼就不会走到visit()函数 而后子节点里面的东西就不会draw()了
同样这块骨骼如果是已经添加图片或者动画之类的 draw过自己之后 同样 也不会去visit子节点了
以上都不是的时候 才以一个node的形式去visit了 但是动画编辑器中貌似不能直接添加一个空的node绑定到骨骼中(如果可以 请告诉我 5555555.。。。。。。。。 )
我想知道 这个是个引擎骨骼动画的一个bug 还是引擎是特意这样设计的 为什么?
5555555555555555.。。。。。。。。。。。。。。。。。。。。。
大半夜不睡觉 还在写代码的人 求助啊。。。。。55555.。。
PS:我使用的是 cocos2dx 2.2.1版本
人气那么差啊 都没人回复 
为啥光有浏览的 也没有回复的?
不会出现你说的问题啊,
else if(CCNode *node = dynamic_cast<CCNode *>(object))
{
if (m_pAtlas)
{
m_pAtlas->drawQuads();
m_pAtlas->removeAllQuads();
}
node->visit();
CC_NODE_DRAW_SETUP();
ccGLBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
}
这段代码里面的 node->visit(); 会遍历node的所有孩子节点进行渲染的。
仔细看一下它的这个逻辑 CCARRAY_FOREACH(m_pChildren, object) 是遍历这个动画的根节点下的子节点的 pEffectNode把某一个骨骼当中父节点 跟随移动的 也就是添加到了object的m_pChildren子节点列表中的 当if (CCBone *bone = dynamic_cast<CCBone *>(object)) 是骨骼的时候 就第一个if里面去了 而且bone的渲染节点不为空的时候才会继续往下走 没有机会去 bone->visit() 5555555…