cocos2d禁用触及所有其他视图

时间:2012-07-04 04:51:34

标签: cocos2d-iphone touch cocos2d-x

以下是我的想法。不知道有没有更容易的方法来做到这一点。

假设我只希望菜单图层可以随时触摸。
我把隐形层放在接触处。

bool tNoTouchLayer::init()
{
    if(!CCLayer::init()) {
        return false;
    }

    setIsTouchEnabled(true);

    return true;
}

void tNoTouchLayer::registerWithTouchDispatcher()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);

}

bool tNoTouchLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    return true;
}

现在我可以在添加菜单图层之前添加noTouchLayer,并且所有触摸都会被noTouchLayer窃取。

5 个答案:

答案 0 :(得分:0)

就我所知,你就是这样做的。但请注意,您的代码不会禁用添加到场景中的任何菜单。为此,您必须在添加弹出窗口时从触摸调度程序中删除菜单,并在删除弹出窗口时再将其添加回来。

要从触摸调度程序中删除菜单,您可以执行以下操作:

CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(menu);

并将其添加回来可以执行此操作:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(menu, kCCMenuHandlerPriority, true);

其中menu是您的CCMenu节点。

作为提示,我创建了一个类似上面的类,但我还添加了弹出菜单,在一个节点中创建一个触摸阻止菜单。 :)

答案 1 :(得分:0)

这不是你正在寻找的答案,但是这里有一些想法:

如果您尝试弹出窗口,是否可以尝试弹出UIAlertView的子类(看起来像您想要的那样)?

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-uialertview-custom-graphics/

答案 2 :(得分:0)

这是另一种方法:

保持应用的状态以及哪个层位于“顶部”。

在每个菜单监听器中,让他们都检查当前图层的状态是否应该允许按下该菜单按钮。

另外,您可以覆盖“addchild”以查看它是否是MenuItem,如果它是MenuItem,则让它检查是否应该启用它。如果没有,立即返回,而不是执行其余的代码

答案 3 :(得分:0)

最后,我确实找到了更多相关信息:

http://code.google.com/p/cocos2d-iphone/issues/detail?id=1033

菜单项是偷窃触摸的原因是因为菜单项的触摸优先级设置为最高(最低char值)...

您可以将kCCMenutouchPriority更改为0。

答案 4 :(得分:0)

如果我正确理解了您的问题,我猜您会尝试执行“暂停屏幕”等操作以弹出并禁用所有其他图层。

嗯,您在评论中说过,您不希望在其他区域中启用触摸事件,而不是您的弹出式区域。基本上,我认为我们应该在层次方面进行思考,以便更容易理解,更容易实现。

让我们看看我们是否拥有“主要图层”,其中包含其他游戏对象以显示为其子项(假设它们也在运行动画)。现在你触摸一个按钮,想要弹出“暂停图层”。您必须执行以下操作才能禁用其他图层+对象的所有触摸事件。

  • 暂停图层的计划和操作[via pauseSchedulerAndActions()]
  • 暂停图层内的所有游戏对象(即敌人)[via pauseSchedulerAndActions()]
  • 禁用CCMenu对象(如果有),这将忽略CCMenu相关对象上的触摸事件ie.CCMenuItemImage [via setEnabled(false)]
  • 为图层本身停用触控事件[via setTouchEnabled(false)]

前两点是关于停止运行任何计划方法和动画。 后两点是关于停止接受触摸事件。您可以看到CCMenu *相关类与CCLayer分开维护自己的触摸事件,因此我们需要通过设置CCMenu *对象和图层本身来做额外的工作。

我试过这个,对我来说效果很好。此外,它更好,因为我们不必直接在我看来设置调度员。