2012-05-07 14 views
6

Tengo un CCMenu con 5 CCMenuItem s. Cuando el usuario toca un elemento del menú, quiero que el elemento del menú se mueva a la derecha 10 píxeles, para distinguirlo de los demás. Traté de hacer que cada elemento del menú fuera una variable global para poder decir: if (item.isSelected) { [item runAction:blah]; } Pero esto no hizo nada. Este es mi código hasta ahora:Animación CCMenuItem Cocos2d en la selección

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)]]; 
} 

Mi pregunta es: ¿cómo puedo lograr el efecto que mencioné anteriormente? Quiero que el CCMenuItem seleccionado se mueva a la derecha de 10 píxeles cuando el usuario lo toca pero no lo suelta, y luego vuelve a su posición normal cuando el toque abandona ese elemento del menú. Además, ¿dónde debería poner este código de animación? En mi función init? Gracias por la ayuda

+0

Tengo lo mismo y estoy usando un código para que pueda probar ese código. Estoy seguro de que será un buen trabajo para usted. – vishiphone

+0

¿Podría verlo? – Seany242

Respuesta

9

Si desea cambiar el comportamiento 'listo para usar' del objeto CCMenuItemLabel, deberá subclasificar esa clase específica de cocos2d. Los métodos que deberá anular son

-(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); 
} 

El método 'seleccionado' se invoca cuando el dedo toca la etiqueta. El método 'no seleccionado' se invoca cuando el dedo se levanta o se arrastra fuera de la etiqueta. Acabo de mostrarle un enfoque básico (muy) para el comportamiento seleccionado/no seleccionado, experimentar con él. Hay problemas de tiempo involucrados. Evitaría el uso de animaciones como primer intento como este. Mire el código en la clase CCMenuItemLabel si quiere un ejemplo con animación.

+0

¿Dónde iría esto? En el mismo archivo que mi código anterior? – Seany242

+0

Nvm, lo tengo para trabajar. ¡Gracias! – Seany242

7

Comprobar la siguiente línea de remolque de código:

CCMenuItem *item31 = [CCMenuItemImage itemFromNormalImage:@"btn_on.png" selectedImage:@"btn_on_hover.png"]; 
    CCMenuItem *item32 = [CCMenuItemImage itemFromNormalImage:@"btn_off.png" selectedImage:@"btn_off_hover.png"]; 
  • Al igual que en el código anterior se puede ajustar btn_on_hover.png de tal manera que se vea como ha compensado de 10px a del lado derecho o donde quieras.
  • Puede realizar su tarea de muchas maneras ya que cocos2d es de código abierto. marque CCMenu.h clase. usted puede modificar la clase según su requisito.
  • por ejemplo, puede hacer cambios en el siguiente fragmento de código en la clase CCMenu.h.

    #pragma mark Menu - Touches 
        #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED 
    

Avísame en caso de cualquier duda. Saludos, Neil.