2012-08-12 3 views
3

J'ai un Menu ("myMenu") contenant CCMenuItemImage s. Je voudrais que ce menu détecte les balayages de doigt et glisse en conséquence.Coulissant un CCMenu

Mon problème est que les CCMenuItemImage semblent absorber l'événement tactile. Le balayage fonctionne correctement lorsque l'utilisateur touche le menu en dehors de CCMenuItemImages, mais pas lorsque le toucher se produit sur ceux-ci.

J'ai essayé de mettre mes éléments de menu dans un calque pour détecter les touches (en me référant à Scrollable menu using MenuItem's), mais cela ne semble pas fonctionner non plus. Une idée pourquoi?

+(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 

Répondre

3

a résolu le problème en ajoutant:

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

le problème était que CCMenuItemImage avale la touche et a une priorité fixée à -128. Ainsi, la nécessité d'établir la priorité à INT_MIN+1

+0

Où avez-vous ajouté ce code? Je suis également coincé au même point? – user1201239

+0

Dans la classe CCScene qui contient le CCMenuItemImages – David

+0

Merci mec !!! – user1201239