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

Cocos2d iphone Cocos2d:检查CCNode/CCSprite是否在显示列表上,cocos2d-iphone,cocos2d-x,Cocos2d Iphone,Cocos2d X,在ActionScript中,我只需检查显示对象的.stage属性,如果该属性为null,则显示对象不在显示列表中。是否有cocos2d等价物 我正在控制我自己的按钮触摸系统等,我想要一个快速的方式来忽略按钮注册,但实际上并没有在屏幕上。我目前正在检查可见的和父项,但这并不是一条完整的链,因此如果我在内存中有一个不可见/附加到任何内容的弹出窗口,并且该弹出窗口中有一个作为子项的按钮,则按钮检查将通过(因为它是可见的,并且有父项) 除了循环所有的节点直到场景,是否有一种简单的方法来检查显示列表上是

在ActionScript中,我只需检查
显示对象
.stage
属性,如果该属性为
null
,则显示对象不在显示列表中。是否有cocos2d等价物

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

除了循环所有的节点直到场景,是否有一种简单的方法来检查显示列表上是否有
CCNode/CCSprite

编辑

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


您可以使用CCNode::isVisible()和CCControl::hasVisibleParents(),它们将在内部上升到所有节点层次结构

这是你用同样的方法能得到的最接近的结果

例如:

bool presentInDisplayList() {
if(isVisible() && hasVisibleParents())
    return true;
else
    return false;
}
其中hasVisibleParents()是(从Cocos2d-X库复制)


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

您可以使用CCNode::isVisible()和CCControl::hasVisibleParents(),它们将在内部上升到所有节点层次结构

这是你用同样的方法能得到的最接近的结果

例如:

bool presentInDisplayList() {
if(isVisible() && hasVisibleParents())
    return true;
else
    return false;
}
其中hasVisibleParents()是(从Cocos2d-X库复制)


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

几乎唯一的方法是在将menu.enabled属性推出视图时将其设置为NO,在其再次可见和可用时将其设置为YES。与父类(CCLayer)的.isTouchEnabled属性相比,更喜欢该属性。CCMenu随后将忽略任何触摸事件,而不会发送到基础菜单项(按钮)。afaik的cocos2d中没有“显示列表”这样的东西。我没有使用
CCMenu
CCMenuItem
,因为在我们的系统中,它对于我们的用例来说非常重,任何
CCNode
都可以注册到
TouchManager
中,因此每个对象都会对触摸位置执行命中测试-因此,如果
CCNode
不在显示列表中,则需要快速退出。执行此操作的唯一方法是将menu.enabled属性设置为NO,然后将其推出视图,是的,当它再次变得可见和可用时。与父类(CCLayer)的.isTouchEnabled属性相比,更喜欢该属性。CCMenu随后将忽略任何触摸事件,而不会发送到基础菜单项(按钮)。afaik的cocos2d中没有“显示列表”这样的东西。我没有使用
CCMenu
CCMenuItem
,因为在我们的系统中,它对于我们的用例来说非常重,任何
CCNode
都可以注册到
TouchManager
,因此每个对象都会对触摸位置执行命中测试-因此,如果
CCNode
不在显示列表中,则需要快速退出我猜
hasVisibleParents()
仅在cocos2d-x中,因为它似乎不存在于cocos2d iphone中:/-它是否会在到达场景时自动停止检查(因为场景的
父级
null
)?是的,它将在场景中停止。。您还可以为hasVisibleParents()编写方法。。检查修改后的答案…所以我开始实施这个问题-看我修改后的问题-我必须更改代码,因为这对我所寻找的东西不起作用:D-如果
父项
NULL
,那么它将返回
true
。如果您检查
null
,那么它将始终返回
false
,因为
场景没有父对象我猜
hasVisibleParents()
仅在cocos2d-x中,因为它在cocos2d iphone中似乎不存在:/-它到达场景时会自动停止检查吗(由于场景的
父项
null
)?是的,它将在场景中停止。此外,您还可以为hasVisibleParents()编写方法…检查修改后的答案…所以我开始实施这个-看我修改后的问题-我必须更改代码,因为这对我所寻找的东西不起作用:D-如果
父项
NULL
,那么它将返回
true
。如果检查
NULL
,那么它将返回
false
a所有时间,因为
场景
没有父对象
bool CCControl::hasVisibleParents()
{
    CCNode* pParent = this->getParent();
    for( CCNode *c = pParent; c != NULL; c = c->getParent() )
    {
        if( !c->isVisible() )
        {
            return false;
        }
    }
    return true;
}