Cocos2d iphone Cocos2d层和优先级管理
我有我的主场景,在上面我用Cocos2d iphone Cocos2d层和优先级管理,cocos2d-iphone,Cocos2d Iphone,我有我的主场景,在上面我用CCLayer设置了一个新层,这个层有一个按钮。 但是当我按下那个按钮(CCMenu)时,它后面的一层也是触摸和做事情 我只想启用上层的接触,而不是它下面的一个。 我该怎么做?(设置触摸优先级?如何设置?) 编辑: 我的图层是这样的: -(CCLayer*)showHelpLayer { self.isTouchEnabled=YES; [[CCDirector sharedDirector].touchDispatcher addTargetedDe
CCLayer
设置了一个新层,这个层有一个按钮。
但是当我按下那个按钮(CCMenu
)时,它后面的一层也是触摸和做事情
我只想启用上层的接触,而不是它下面的一个。
我该怎么做?(设置触摸优先级?如何设置?)
编辑:
我的图层是这样的:
-(CCLayer*)showHelpLayer
{
self.isTouchEnabled=YES;
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:-256 swallowsTouches:YES];
...
...
[self addChild:menu];
[menu setHandlerPriority:-257];
return self;
}
helpLayer *hlp=[[helpLayer alloc]init];
[hlp showHelpLayer];
[self addChild:hlp z:100];
我将它添加到主场景中,如下所示:
-(CCLayer*)showHelpLayer
{
self.isTouchEnabled=YES;
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:-256 swallowsTouches:YES];
...
...
[self addChild:menu];
[menu setHandlerPriority:-257];
return self;
}
helpLayer *hlp=[[helpLayer alloc]init];
[hlp showHelpLayer];
[self addChild:hlp z:100];
你可以玩弄优先级,但它会变得很糟糕。我只是在非常具体的情况下才会这么做。最好的方法是在推送新层和控制对象之前禁用“底层场景”上的输入 如果您选择使用优先级,请记住所有菜单都默认使用此优先级(cocos2D 2.xx): 因此,如果您使用优先级,我会将图层设置为-256(吞咽触摸),并将HandlerPriority设置为-257作为您的菜单。因此,任何通过菜单的东西都会被图层捕捉并吞下(即不通过“下方”) 优先办法的例子。在init方法中创建所有菜单对象后,fly-through menu是一个扩展CCNode并执行此操作的类:
- (void)onEnter {
[super onEnter];
MPLOGDEBUG(@"");
[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:-256 swallowsTouches:YES];
[_backMenu setHandlerPriority:-257];
[_toggleOptionsMenu setHandlerPriority:-257];
[_dialogMenu setHandlerPriority:-257];
[_labelMenu setHandlerPriority:-257];
}
好的,我将保存菜单的层设置为-256,具有touchDispatcher优先级,然后我将菜单设置为-257,具有[menu setHandlerPriority:-257],发生的情况是,该层后面的场景没有接触到该层,但该层中的菜单也没有接触到…不确定我的解释是否清楚,我添加了一个来自“推送和弹出”菜单层的工作示例。非常感谢。如果我没弄错的话,这段代码是在上层的pop层类上?这正是我所做的,菜单也是“不获取接触…”(后面的层也不获取接触)我不会设置isTouchEnabled,因为这将层注册为标准触摸代理。注释掉这行。另外,我的示例来自一个扩展了CCNode(而不是CCLayer)的类。在执行OneNet之前,必须创建菜单对象。将图层添加到父对象时,将执行ONENTR。因此,实际上,您必须在“init”方法中创建菜单对象。如果不能这样做,请在创建菜单后立即设置其处理程序优先级。