在我的Cocos2d 2.0 iOS游戏中,我使用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];
//...
现在这个工作正常,菜单显示,正确裁剪并处理触摸。但问题是,当我点击可见菜单下方时,它仍会处理菜单上的触摸,即使前面有一个非透明像素的精灵(foreground
)。
我尝试通过将前景设置为比菜单更高的zorder来摆弄zorder,但这似乎没有改变任何东西。
menuBackground.zOrder = 1;
settingsMenu.zOrder = 2;
foreground.zOrder = 3;
我还尝试将菜单优先级设置为INT_MIN
以及kCCMenuHandlerPriority - 1
,但没有效果。
如何让菜单仅响应用户可见的部分?
由于 阿南德
答案 0 :(得分:1)
要拥有有效的“遮罩”,您应该使用启用了触控功能的图层作为前景。在该图层中,您可以接受菜单外的触摸,并且不对它们执行任何操作,并将其传递到蒙版内部。但是,这会导致问题:如果屏幕内的touchBegan,并且用户将手指拖到外面,菜单仍将继续滚动。您可以将CCAdvancedMenu子类化为实现自己的触摸处理要求,也可以创建自己的版本。我最终做了后者,因为我的游戏设计师想要它的许多其他功能和子类化成为障碍而不是帮助。 BTW,不依赖zOrder进行触摸处理,它们没有关系。
此外,'触摸屏'方法可能会回来并在以后困扰你(例如,如果您在滚动菜单旁边添加其他对象也需要触摸,触摸将被屏蔽掉),最好是与实现触摸相关的需求有关的所有对象都封装了自己的实现。