2012-05-07 19 views
6

Ho un CCMenu con 5 CCMenuItem s. Quando l'utente tocca una voce di menu, voglio che la voce del menu si sposti sui 10 pixel corretti, per distinguerla dagli altri. Ho provato a rendere ogni voce di menu una variabile globale in modo da poter dire: if (item.isSelected) { [item runAction:blah]; } Ma questo non ha fatto nulla. Questo è il mio codice finora:Cocos2d CCMenuItem animazione su selezione

CCLabelTTF *sin = [CCLabelTTF labelWithString:@"Single Player" dimensions:labelSize alignment:UITextAlignmentLeft fontName:font fontSize:20]; 
item1 = [CCMenuItemLabel itemWithLabel:sin target:self selector:@selector(goToSinglePlayer:)]; 

CCLabelTTF *spl = [CCLabelTTF labelWithString:@"Splitscreen" dimensions:labelSize alignment:UITextAlignmentLeft fontName:font fontSize:20]; 
item2 = [CCMenuItemLabel itemWithLabel:spl target:self selector:@selector(goToSplitscreen:)]; 

CCLabelTTF *ach = [CCLabelTTF labelWithString:@"Achievements" dimensions:labelSize alignment:UITextAlignmentLeft fontName:font fontSize:20]; 
item3 = [CCMenuItemLabel itemWithLabel:ach target:self selector:@selector(goToAchievements:)]; 

CCLabelTTF *str = [CCLabelTTF labelWithString:@"Store" dimensions:labelSize alignment:UITextAlignmentLeft fontName:font fontSize:20]; 
item4 = [CCMenuItemLabel itemWithLabel:str target:self selector:@selector(goToStore:)]; 

CCLabelTTF *set = [CCLabelTTF labelWithString:@"Settings" dimensions:labelSize alignment:UITextAlignmentLeft fontName:font fontSize:20]; 
item5 = [CCMenuItemLabel itemWithLabel:set target:self selector:@selector(goToSettings:)]; 

CCMenu * mainMenu = [CCMenu menuWithItems:item1, item2, item3, item4, item5, nil]; 

[mainMenu setColor:ccBLACK]; 
[mainMenu alignItemsVerticallyWithPadding:10]; 
mainMenu.position = ccp(90, 90); 

[self addChild:mainMenu]; 

if (item1.isSelected) { 
    [item1 runAction:[CCMoveTo actionWithDuration:1.0f position:ccp(120, 90)]]; 
} 

La mia domanda è: come posso ottenere l'effetto che ho menzionato prima? Voglio che lo CCMenuItem selezionato si sposti verso i 10 pixel corretti quando l'utente lo tocca ma non lo rilascia, quindi torna alla sua posizione normale quando il tocco lascia quella voce di menu. Inoltre, dove dovrei inserire questo codice di animazione? Nella mia funzione init? Grazie per l'aiuto

+0

Ho lo stesso questo e sto usando un codice per quello puoi provare quel codice sono sicuro che sarà lavoro per te. – vishiphone

+0

Posso vederlo? – Seany242

risposta

9

Se si desidera modificare il comportamento "out of the box" dell'oggetto CCMenuItemLabel, è necessario eseguire la sottoclasse di quella classe specifica di cocos2d. I metodi necessari per eseguire l'override sono

-(void) selected{ 
    // coco's default is to scale up by 10% 
    // place your code to displace the label. 
    self.position=ccp(self.position.x-10,self.position.y); 
} 

-(void) unselected{ 
    // coco's default is to bring back scale to originalScale. 
    self.position=ccp(self.position.x+10,self.position.y); 
} 

Il metodo "selezionato" viene chiamato quando il dito tocca l'etichetta. Il metodo "non selezionato" viene chiamato quando il dito viene sollevato o trascinato all'esterno dell'etichetta. Ti ho appena mostrato un approccio (molto) di base al comportamento selezionato/non selezionato, sperimentalo. Ci sono problemi di temporizzazione coinvolti. Eviterei l'uso di animazioni come primo tentativo come questo. Guarda il codice nella classe CCMenuItemLabel se vuoi un esempio con l'animazione.

+0

Dove andrebbe? Nello stesso file del mio codice sopra? – Seany242

+0

Nvm, ho capito. Grazie! – Seany242

7

Controllare la seguente linea di traino di codice:

CCMenuItem *item31 = [CCMenuItemImage itemFromNormalImage:@"btn_on.png" selectedImage:@"btn_on_hover.png"]; 
    CCMenuItem *item32 = [CCMenuItemImage itemFromNormalImage:@"btn_off.png" selectedImage:@"btn_off_hover.png"]; 
  • Come nel codice qui sopra è possibile regolare btn_on_hover.png modo tale da sembrare che ha compensato di 10px a lato destro o dove vuoi.
  • Puoi ottenere il tuo compito in molti modi, dato che cocos2d è open source. controlla la classe CCMenu.h. puoi modificare la classe secondo il tuo requisito.
  • ad esempio è possibile apportare modifiche nel seguente frammento di codice nella classe CCMenu.h.

    #pragma mark Menu - Touches 
        #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED 
    

Fammi sapere in caso di qualsiasi domanda. Cordiali saluti, Neil.