2012-08-12 124 views
3

我有一个包含CCMenuItemImage s的菜单(“myMenu”)。我希望这个菜单检测手指滑动并相应滑动。滑动CC菜单

我的问题是,CCMenuItemImage似乎吸收触摸事件。当用户触摸CCMenuItemImages之外的菜单时,滑动效果很好,但当触摸发生在这些滑动时,滑动效果不佳。

我试图把我的菜单项放在一个图层来检测触摸(参考答案Scrollable menu using MenuItem's),但这似乎也不工作。任何想法为什么?

+(id) scene 
{ 
    CCScene *scene = [CCScene node]; 
    ModeMenuScene *layer = [ModeMenuScene node]; 
    [scene addChild: layer]; 
    return scene; 
} 

-(id) init 
{ 
    if((self=[super init])) { 


     CGSize winSize = [[CCDirector sharedDirector] winSize]; 
     CCSprite *background = [CCSprite spriteWithFile:@"bg.png"]; 
     background.position=ccp(winSize.width/2,winSize.height/2); 
     [self addChild:background]; 

     mode1 = [CCMenuItemImage itemFromNormalImage:@"Mode1.png" selectedImage: @"Mode1.png" target:self selector:@selector(goToMode1:)]; 
     mode1label = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"Level 1 %d", n] dimensions:CGSizeMake(220,53) alignment:UITextAlignmentCenter fontName:@"Arial" fontSize:20.0]; 
     mode1label.color = ccc3(167,0,0); 
     mode1label.position=ccp(55,-30); 
     [mode1 addChild:mode1label]; 

    // here same kind of code to define mode2,mode3,mode4 (taken out to reduce size of code) 

     myMenu=[CCMenu menuWithItems:mode1,mode2,mode3,mode4,nil]; 
     [myMenu alignItemsHorizontallyWithPadding:25]; 
     myMenu.position=ccp(winSize.width/2+40,180); 
     menuLayer = [CCLayer node]; 
     [menuLayer addChild:myMenu]; 
     [self addChild:menuLayer]; 

     [self enableTouch]; 

    } 
    return self; 
} 

-(void) disableTouch{ 
    self.isTouchEnabled=NO; 
    menuLayer.isTouchEnabled=NO; 
} 

-(void) enableTouch{ 
    self.isTouchEnabled=YES; 
    menuLayer.isTouchEnabled=YES; 
} 


-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:[touch view]]; 
    if(location.y>100 && location.y<260) { 
     draggingMenu=1; 
     x_initial = location.x; 
    } 
    else draggingMenu=0; 
} 


-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:[touch view]]; 
    if(draggingMenu==1) { 
     CGSize winSize = [[CCDirector sharedDirector] winSize]; 
     int x = myMenu.position.x+location.x-x_initial; 
     x = MAX(0,x); 
     x = MIN(x,winSize.width/2+40); 
     myMenu.position=ccp(x,180); 
     x_initial=location.x; 
    } 
} 

- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    draggingMenu=0; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

@end 

回答

3

加入解决了这个问题:

-(void) registerWithTouchDispatcher 
{ 
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:INT_MIN+1 swallowsTouches:NO]; 
} 

的问题是,CCMenuItemImage燕子的接触和具有高优先级设置为-128。因此需要设置优先级INT_MIN+1

+0

你在哪里添加了这段代码?我也坚持同样的观点? – user1201239 2012-09-19 03:48:35

+0

在包含CCMenuItemImages的CCScene类中 – David 2012-09-19 16:01:08

+0

Thanks dude !!! – user1201239 2012-09-20 09:08:31