cocos2d-x中颜色相关动作子节点不跟随父节点的解决方案

版本.cocos2d-x 2.04


我最近做客户端的时候发现所有坐标相关的动作父子节点都是一致的.

唯有颜色相关的动作譬如FadeIn或者TintTo等是只有父节点有动作而子节点保持原样.

于是进到coco底层查了相关源码.

以下以FadeIn的解决为例子.

void CCBlink::update(float time)
{
    if (m_pTarget && ! isDone())
    {
        float slice = 1.0f / m_nTimes;
        float m = fmodf(time, slice);
        m_pTarget->setVisible(m > slice / 2 ? true : false);
    }
}

void CCFadeIn::update(float time)
{
    CCRGBAProtocol *pRGBAProtocol = dynamic_cast(m_pTarget);
    if (pRGBAProtocol)
    {
        pRGBAProtocol->setOpacity((GLubyte)(255 * time));
    }
    /*m_pTarget->setOpacity((GLubyte)(255 * time));*/
}

这是coco底层FadeIn和CCBlink的两个不同的update函数.

可以看到颜色相关的函数做了中转.不是直接对m_pTarget进行操作.

将被注释掉那行取消注释之后显示CCNode是没有该函数的.

于是我猜想应该是由于这个对象不同导致的子节点动作不跟随.

于是做了以下代码处理.

void CCFadeIn::update(float time)
{
    CCRGBAProtocol *pRGBAProtocol = dynamic_cast(m_pTarget);
    if (pRGBAProtocol)
    {
        pRGBAProtocol->setOpacity((GLubyte)(255 * time));
    }
//add begin
    for(int i=0;igetChildrenCount();i++)
    {
         
        CCRGBAProtocol *pRGBAProtocol2 = dynamic_cast(m_pTarget->getChildren()->objectAtIndex(i));
        if (pRGBAProtocol2)
        {
            pRGBAProtocol2->setOpacity((GLubyte)(255 * time));
        }
    }
//add end
    /*m_pTarget->setOpacity((GLubyte)(255 * time));*/
}

之后重新编译生成.测试通过~.


//补充

之后使用的过程中发现这个只遍历了一次子节点.

对子节点的子节点依旧不起到作用.

于是修改成了递归.

void Do_Loop(GLubyte func,CCNode* temp)
{
	CCRGBAProtocol *pRGBAProtocol = dynamic_cast(temp);
	if (pRGBAProtocol)
	{
		pRGBAProtocol->setOpacity(func);
	}
	for(unsigned int i=0;igetChildrenCount();i++)
	{
		Do_Loop(func,(CCNode*)temp->getChildren()->objectAtIndex(i));
	}
}
void CCFadeIn::update(float time)
{
	Do_Loop((GLubyte)(255 * time),m_pTarget);
}
测试通过~.

你可能感兴趣的:(cocos2dx,cocos2d-x,action)