即使在菜单上,我是否可以创建覆盖层以禁用所有触摸?

时间:2013-11-18 12:09:32

标签: cocos2d-x cocos2d-x-3.0

我需要在场景上显示一个弹出图层,创建一个半透明的背景图层,它也会阻止触摸事件的传播。我使用的是最新的cocos2d-x v.3.0-alpha-0。

我想要实现的是一个完全处理触摸的弹出层(例如,按钮,菜单项,滚动视图等),放置在背景层(用于设计目的),覆盖当前场景。场景中的所有项目都不应再响应触摸。

使用新的EventDispatcher课程是否可以实现?我已经能够禁用主场景的所有触摸,但场景中存在的MenuItem的所有实例仍然是可触摸和活动的。 我怎样才能做到这一点?而且,我怎样才能创建一个触摸监听器来阻止所有触摸到主场景而不是弹出窗口?

3 个答案:

答案 0 :(得分:1)

您可以通过将menuitems的setDisable属性设置为false来禁用菜单项。

实施例

 _menuItem->setEnabled(false);

对于图层,请使用setTouchEnabled属性

 _backGroungLayer->setTouchEnabled(false);

确保弹出图层不是您要禁用的图层的子图层。

要禁用菜单中的所有项目,请执行以下操作

假设_menu包含各种菜单项。

CCARRAY_FOREACH(_menu->getChildren(), item)
{
   item.isEnabled=NO; 
}

如果你想禁用所选项目,只需给它们标记。没有必要制作任何列表。

答案 1 :(得分:1)

我遇到了同样的问题并用<nav id="trans-nav"> <%= link_to 'KOR', url_for(:locale => 'ko'), :class => ('active' if I18n.locale.to_s == 'ko' ) %> <%= link_to 'ENG', url_for(:locale => 'en'), :class => ('active' if I18n.locale.to_s == 'en' ) %> <%= link_to 'CHI', url_for(:locale => 'cn'), :class => ('active' if I18n.locale.to_s == 'cn' ) %> </nav> 解决了这个问题。它很脏,但它起作用了:

  1. 使用mm创建一个按钮。
  2. 将按钮大小设置为屏幕大小。
  3. 将此按钮添加为弹出图层的背景。
  4. 这样可以防止点击它背后的任何内容。

答案 2 :(得分:0)

默认情况下,所有CCMenu在cocos2d 2.1中都有一个设置优先级(kCCMenuHandlerPriority = -128)。所以在一个类(通常是一个CCNode后代)想要吞下一切并抢占我在下面这个对话框音序器示例中喜欢的任何东西:

- (void)onEnter {

    backdrop_.visible = self.isBackDropShown;
    MPLOG(@"Adding self as a swallower touch delegate, above the rest of the planet.");
    [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:_dialogTouchPriority swallowsTouches:YES];
    for (CCMenu *mn in _menus) {
       mn.touchPriotity = _dialogTouchPriority -1 ;
    }
    [super onEnter];
} 

其中_dialogTouchPriority默认为kCCMenuHandlerPriority-1。它将在“低于”之前的所有内容之前提供。这是一个糟糕的黑客(cocos2d内部可以改变并打破这个),我知道,但防弹。小心使用,确保你的场景中只有其中一个。