0

在我的 Cocos2d 2.0 iOS 游戏中,我使用 CCMenuAdvanced 创建滚动菜单。问题是菜单的不可见部分似乎也在处理触摸。

这是代码(需要让边界矩形正确显示和裁剪):

// 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,但没有效果。

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

谢谢阿南德

4

1 回答 1

1

要获得有效的“蒙版”,您应该使用启用了触摸的图层作为前景。在该层中,您可以接受菜单外的触摸,不对其进行任何操作,然后将它们传递到遮罩内。但是,这会导致问题:如果 touchBegan 在遮罩内,并且用户将其手指拖到外面,菜单仍将继续滚动。您可以继承 CCAdvancedMenu 来实现您自己的触摸处理要求,或者创建您自己的版本。我最终选择了后者,因为我的游戏设计师想要从中获得许多其他功能,而子类化成为障碍而不是帮助。顺便说一句,不要依赖 zOrder 进行触摸处理,它们不相关。

此外,“触摸蒙版”方法可能会在以后再次出现并困扰您(例如,如果您在滚动菜单旁边添加其他也需要触摸的对象,则触摸将被屏蔽),最好是所有对象与实现触摸相关的需求有关的那些封装了他们自己的实现。

于 2013-02-06T12:09:11.097 回答