1

在 ActionScript 中,我可以只检查.stagea 的属性DisplayObject,如果是nullDisplayObject则不在显示列表中。是否有 cocos2d 等价物?

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

除了循环所有直到场景之外,是否有一种简单的方法可以检查 aCCNode/CCSprite是否在显示列表中?

编辑

处理@HariKrishna 的答案,这是我想出的代码,因为 cocos2d-x 实现并不是我想要的(例如,如果parent节点的 是nil,那么它将返回YES,因为它永远不会进入检查) :

- (BOOL) hasVisibleParents
{
    CCNode * p = self.parent;
    while( true )
    {
        if( p == nil || !p.visible )
            return NO;
        if( [p isKindOfClass:[CCScene class]] )
            return YES;
        p = p.parent;
    }
    return YES;
}
4

1 回答 1

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

于 2013-09-27T04:32:54.837 回答