Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocos2d iphone Cocos2d层和优先级管理_Cocos2d Iphone - Fatal编程技术网

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”方法中创建菜单对象。如果不能这样做,请在创建菜单后立即设置其处理程序优先级。