最近做游戏时,当一个对象移动时希望他在最上层,这个功能几乎没有什么难度,用Cocos2d的地球人都知道setZorder,
改变zorder的值,越大越在上面。
this->setZOrder(888);
肯定就ok了,可我没有看到都ok,看样子888还不吉利,换成999也不行,崩溃!!!!
查看代码:
void CCNode::setZOrder(int z)
{
_setZOrder(z);
if (m_pParent)
{
m_pParent->reorderChild(this, z);
}
}
没问题,除非不是用Zorder来控制层次的
我们看看 m_pParent->reorderChild(this, z);
void CCSprite::reorderChild(CCNode *pChild, int zOrder)
{
CCAssert(pChild != NULL, "");
CCAssert(m_pChildren->containsObject(pChild), "");
if (zOrder == pChild->getZOrder())
{
return;
}
if( m_pobBatchNode && ! m_bReorderChildDirty)
{
setReorderChildDirtyRecursively();
m_pobBatchNode->reorderBatch(true);
}
CCNode::reorderChild(pChild, zOrder);
}
reorderChild有好多,看看CCSprite的吧
if (zOrder == pChild->getZOrder())
{
return;
}
zOrder是setZorder的参数z 这里 888
pChild是this,他的getZorder是什么,888,为什么因为setZOrder方法中调用reorderChild前第一句_setZOrder(z);已经赋值了。
所以if (zOrder == pChild->getZOrder()) 变成了 if (zOrder == zOrder), 妈的铁定return
不明白他们为什么这么写代码,只能解释成CCSprite的setZOrder就不能直接用来调顺序。
想直接调顺序很简单,
this->getParent()->reorderChild(this,666);
不陪他们转圈了,哈哈,看样子还是666吉利!
大家顺便去看一看这一篇,himi的
http://www.himigame.com/iphone-cocos2d/516.html