2013-02-06 23 views
0

在我的Cocos2d 2.0 iOS游戏中,我使用CCMenuAdvanced创建了一个滚动菜单。问题在于菜单的不可见部分也似乎在处理触摸。CCMenuAdvanced即使在它上面有一个精灵时也会被点击

下面是代码(以获得boundaryRect显示和作物正常需要):

// background is full screen, with all pixels transparent 
// except the part where menu shows 
CCSprite *menuBackground = [CCSprite spriteWithFile:@"scrollingmenubackground.png"]; 
//... 
[self addChild:menuBackground]; 
//...  
//create menu items 
CCMenuAdvanced *settingsMenu = [CCMenuAdvanced menuWithItems:item1, item2, item3, nil]; 
//... 
[menuBackground addChild:settingsMenu]; 

// foreground is full screen, with an image  
// with a transparent hole where the menu shows 
CCSprite *foreground = [CCSprite spriteWithFile:@"scrollingmenuforeground.png"];  
[menuBackground addChild:foreground]; 
//... 

现在能正常工作,并且菜单显示,在正确裁剪和处理触摸。但是,问题是,当我点击可见菜单下方时,它仍然会处理菜单上的触摸,即使前面有一个不透明像素的精灵(​​)。

我试过用zorder设置前景比菜单摆弄zorder,但似乎没有改变任何东西。

menuBackground.zOrder = 1; 
    settingsMenu.zOrder = 2; 
    foreground.zOrder = 3; 

我也试过菜单优先级设置为INT_MIN以及kCCMenuHandlerPriority - 1,但没有效果。

如何让菜单只响应用户可见的部分?

感谢 阿南德

+0

你的问题是什么?这听起来更像是一个错误报告/功能请求给我。这就是CCMenu和CCMenuAdvanced的行为。而zOrder与输入无关。 – LearnCocos2D

+0

我希望CCMenuAdvanced只对位于前景的位置(在我的情况下只位于边界矩形内)做出响应。在滚动看不见的部分,它上面有一个精灵,它不应该对点击作出响应。我如何实现这一目标? – Anand

回答

1

有一个有效的“面具”,你应该为前景启用触摸使用层。在该层中,您可以接受菜单外的触摸,并且不执行任何操作,并将其传递到面罩内。但是,这会造成一些问题:如果面具内的touchBegan和用户将手指拖到外面,菜单仍然会继续滚动。您可以继承CCAdvancedMenu以实现自己的触摸处理要求,也可以创建自己的版本。我最终做了后者,因为我的游戏设计师需要它的许多其他功能,并且子类化成为阻碍而不是帮助。顺便说一下,不要依靠zOrder来进行触摸处理,它们是无关的。另外,'触摸屏'方法可能会在以后回来并困扰你(例如,如果你在滚动菜单旁边添加其他对象也需要触摸,那么触摸将被遮住),这将是最好的如果所有涉及实现触摸相关需求的对象都封装了自己的实现。

+0

谢谢,这工作。我添加了一个支持触摸的图层来处理或拒绝位于包含菜单的背景图层之上的触摸。它现在工作... – Anand

相关问题