【问题标题】:cocos2d disable touches to all other viewscocos2d 禁用对所有其他视图的触摸
【发布时间】:2012-07-04 04:51:34
【问题描述】:

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

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

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

【问题讨论】:

  • 其实,看不懂,你想干什么……
  • 相同。不能简单地使用 setIsTouchEnabled(false) 禁用触摸吗?
  • 如何显示一个小于屏幕尺寸且可触摸的弹出菜单,从而禁用对其他区域的触摸?
  • 假设您的菜单层是主层的子层。在你的菜单层覆盖 onEnter() 并调用 ((CCLayer*)(this->getParent()))->setIsTouchEnabled(false),它会工作吗?
  • 如果我的任何答案都可以接受/好,请您接受/点赞吗?

标签: cocos2d-iphone touch cocos2d-x


【解决方案1】:

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

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

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

您可以将 kCCMenutouchPriority 改为 0。

【讨论】:

    【解决方案2】:

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

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

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

    要添加回来,您可以这样做:

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

    其中 menu 是您的 CCMenu 节点。

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

    【讨论】:

    • 我发现这种方法有问题。如果在从触摸调度器中移除菜单时,用户按住菜单中的任何按钮,则在再次将菜单添加到触摸调度器后,菜单中的任何按钮都将不起作用。我已经在this cocos2d-x forum thread 中发布了这个问题。
    【解决方案3】:

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

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

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

    【讨论】:

    • 禁用对某物的触摸,你也可以setEnabled:NO
    【解决方案4】:

    这是另一种方法:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-22
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        相关资源
        最近更新 更多