2

下面是我想出的。想知道是否有更简单的方法来做到这一点。

假设我只希望菜单层在启动时是可触摸的。
我放置了会吞下触摸的隐形层。

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 窃取。

4

5 回答 5

0

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

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

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

并将其添加回来,您可以这样做:

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

其中 menu 是您的 CCMenu 节点。

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

于 2012-07-19T04:47:15.677 回答
0

这不完全是您正在寻找的答案,但这里有一些值得思考的地方:

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

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

于 2012-11-02T15:53:18.293 回答
0

这是另一种方法:

保持应用程序的状态以及哪个图层“在顶部”。

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

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

于 2012-11-09T18:38:41.840 回答
0

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

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

菜单项窃取触摸的原因是菜单项的触摸优先级设置为可能的最高(最低字符值)......

您可以将 kCCMenutouchPriority 改为 0。

于 2012-11-09T18:40:13.067 回答
0

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

好吧,您在评论中说您不希望在其他区域启用触摸事件,但不是您的弹出区域。基本上,我认为我们应该从层的角度来考虑,以便于理解和实现。

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

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

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

我试过这个,它对我很有效。此外,在我看来,我们不必直接设置调度程序,这样会更好。

于 2013-02-10T21:41:38.273 回答