以下是我的想法。不知道有没有更容易的方法来做到这一点。
假设我只希望菜单图层可以随时触摸。
我把隐形层放在接触处。
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窃取。
答案 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)
如果我正确理解了您的问题,我猜您会尝试执行“暂停屏幕”等操作以弹出并禁用所有其他图层。
嗯,您在评论中说过,您不希望在其他区域中启用触摸事件,而不是您的弹出式区域。基本上,我认为我们应该在层次方面进行思考,以便更容易理解,更容易实现。
让我们看看我们是否拥有“主要图层”,其中包含其他游戏对象以显示为其子项(假设它们也在运行动画)。现在你触摸一个按钮,想要弹出“暂停图层”。您必须执行以下操作才能禁用其他图层+对象的所有触摸事件。
前两点是关于停止运行任何计划方法和动画。 后两点是关于停止接受触摸事件。您可以看到CCMenu *相关类与CCLayer分开维护自己的触摸事件,因此我们需要通过设置CCMenu *对象和图层本身来做额外的工作。
我试过这个,对我来说效果很好。此外,它更好,因为我们不必直接在我看来设置调度员。