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

Cocos2d x 我是否可以创建一个覆盖层来禁用所有触摸,即使是在菜单上?,cocos2d-x,cocos2d-x-3.0,Cocos2d X,Cocos2d X 3.0,我需要在场景上显示一个弹出层,创建一个半透明的背景层,这也将阻止触摸事件的传播。我正在使用最新的cocos2d-xv。3.0-alpha-0 我想要实现的是一个弹出层,完全处理触摸(例如按钮、菜单项、滚动视图等),放置在覆盖当前场景的背景层上(出于设计目的)。场景中的所有项目都不应再对触摸作出响应 使用新的EventDispatcher类是否可以实现这一点?我已经能够禁用对主场景的所有触摸,但是场景中的MenuItem的所有实例仍然可以触摸并处于活动状态。 我怎样才能做到这一点?另外,我如何创建

我需要在场景上显示一个弹出层,创建一个半透明的背景层,这也将阻止触摸事件的传播。我正在使用最新的cocos2d-xv。3.0-alpha-0

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

使用新的
EventDispatcher
类是否可以实现这一点?我已经能够禁用对主场景的所有触摸,但是场景中的
MenuItem
的所有实例仍然可以触摸并处于活动状态。
我怎样才能做到这一点?另外,我如何创建一个触摸监听器,防止所有触摸主场景而不是弹出窗口?

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

范例

 _menuItem->setEnabled(false);
对于图层,请使用setTouchEnabled属性

 _backGroungLayer->setTouchEnabled(false);
确保弹出层不是要禁用的层的子层

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

假设_菜单包含各种菜单项

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

如果你想禁用所选项目,只需给它们标签。不需要列出任何列表

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

- (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内部可以改变并打破这一点),我知道,但防弹。小心使用,确保场景中只有其中一个

我遇到了同样的问题,并用
mm
解决了它。它很脏,但它起作用了:

  • 使用
    ccui.button
    创建一个按钮
  • 将按钮大小设置为屏幕大小
  • 将此按钮添加为弹出层的背景
  • 这将防止单击它后面的任何内容

  • 所有菜单项都位于表视图中。难道不可能在没有完整菜单项列表的情况下禁用对菜单项的触摸吗?我不想保存该列表,因为它现在由数据源处理。我只是为此添加了几行。如果禁用CCSpriteMenuItems,您将更改它们的外观,这可能不是@marzapower想要实现的。我不确定cocos2d不是objectiveC,但对于2.1版,您应该禁用菜单(而不是菜单项)。这将防止菜单的触摸处理程序接受触摸,从而将其传播到嵌入的菜单项。使用菜单的“enabled”属性,而不是基础CCLayer的isTouchEnabled属性。
    setTouchEnabled
    不推荐使用。我不确定这在cocos2d-x 3.0中是否有效。他们在事件处理方面改变了很多事情。不确定。。。但这只是一个想法。仅此一点就足以让我停止升级cocos2d,并尽可能长时间地使用2.1,如果objc代码库也有同样的“改进”。为工作而工作,我可能会选择在SpriteKit上投入时间。这不是一个完全的重新设计。只是一些事情改变了。如果/当切换到3.0时,您仍然可以利用cocos2d的现有知识。