版本.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<CCRGBAProtocol*>(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<CCRGBAProtocol*>(m_pTarget);
if (pRGBAProtocol)
{
pRGBAProtocol->setOpacity((GLubyte)(255 * time));
}
//add begin
for(int i=0;i<m_pTarget->getChildrenCount();i++)
{
CCRGBAProtocol *pRGBAProtocol2 = dynamic_cast<CCRGBAProtocol*>(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<CCRGBAProtocol*>(temp);
if (pRGBAProtocol)
{
pRGBAProtocol->setOpacity(func);
}
for(unsigned int i=0;i<temp->getChildrenCount();i++)
{
Do_Loop(func,(CCNode*)temp->getChildren()->objectAtIndex(i));
}
}
void CCFadeIn::update(float time)
{
Do_Loop((GLubyte)(255 * time),m_pTarget);
}
測試通過~.