先创建,隐藏在后台,需要时再显示,这个流程小心节点看不见
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());
}
}
}