cocos2d-x 2.0 小心CCNode::setVisible,一不小心就看不见了

来源:互联网 发布:游戏编程软件下载 编辑:程序博客网 时间:2024/04/27 17:48

先创建,隐藏在后台,需要时再显示,这个流程小心节点看不见

class CTestLayer
{
CCSprite * m_pTestSprite;
void onEnter()
{
m_pTestSprite = CCSprite::create("XXX");
m_pTestSprite->setVisible(false);  //此时我不想显示
this->addChild(m_pTestSprite);
}


bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
//理论上,调用这个,精灵就能显示,实际上还是看不见
//因为没弄脏不重绘

m_pTestSprite->setVisible(true);
//所以最简单弄脏的方法,就是重置一下坐标点
m_pTestSprite->setPosition(m_pTestSprite->getPosition());   //m_bIsTransformDirty = m_bIsInverseDirty = true;
return false;
}

}


其实我想的做法,应该是CCNode::setVisible(TRUE)时,应该设置m_bIsTransformDirty = m_bIsInverseDirty = true

同时,把所有子节点的m_bIsTransformDirty = m_bIsInverseDirty = true;


        CCNode::setVisible(bool bVisible)
{
bool bChange = m_bIsVisible == bVisible);
m_bIsVisible = bVisible;
if(bChange && bVisible)
{

                        //弄脏自身

                        this->setPosition(this->getPosition());     

                       //弄脏所有子节点
CCArray * pChildArr = CCNode::getChildren();
for(int i = 0; i < pChildArr->count(); ++i)
{
CCNode * thisChild = (CCNode *)pChildArr->objectAtIndex(i);
thisChild->setPosition(thisChild->getPosition());
}
}
}