Cocos2d:检查CCNode / CCSprite是否在显示列表中

时间:2013-09-25 14:07:07

标签: cocos2d-iphone cocos2d-x

在ActionScript中,我只需检查.stage的{​​{1}}属性,如果它是DisplayObject,则null不在显示列表中。是否有cocos2d等效?

我正在控制我自己的触摸系统按钮等,我想快速忽略已注册但实际上不在屏幕上的按钮。我目前正在检查DisplayObjectvisible,但这并不会一直向上,所以如果我在内存中有一个弹出窗口,它不可见/附加到任何东西,并且按钮作为弹出窗口内的一个孩子,按钮检查将通过(因为它是可见的并且有父母)。

除了将所有内容循环到场景之外,还有一种简单的方法可以检查显示列表中是否有parent吗?

修改

使用@ HariKrishna的答案,这是我提出的代码,因为cocos2d-x实现并不是我想要的(例如,如果节点的CCNode/CCSpriteparent ,然后它将返回nil,因为它永远不会进入支票):

YES

1 个答案:

答案 0 :(得分:1)

您可以使用CCNode :: isVisible()和CCControl :: hasVisibleParents(),它将在内部进入所有节点层次结构......

这是你能得到的最接近的。

示例:

bool presentInDisplayList() {
if(isVisible() && hasVisibleParents())
    return true;
else
    return false;
}

hasVisibleParents()的位置,(从Cocos2d-X库复制)

bool CCControl::hasVisibleParents()
{
    CCNode* pParent = this->getParent();
    for( CCNode *c = pParent; c != NULL; c = c->getParent() )
    {
        if( !c->isVisible() )
        {
            return false;
        }
    }
    return true;
}

这可以很容易地转换为Objective-C