cocos2dx 骨骼动画渲染的bug?版主们 看过来啊 有知道的小伙伴们么

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版本

人气那么差啊 都没人回复 :3:

为啥光有浏览的 也没有回复的?:6:

不会出现你说的问题啊,
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…