6 Stimmen

Cocos2d CCMenuItem Animation bei Auswahl

Ich habe eine CCMenu mit 5 CCMenuItem s. Wenn der Benutzer einen Menüpunkt berührt, möchte ich, dass der Menüpunkt um 10 Pixel nach rechts verschoben wird, um ihn von den anderen zu unterscheiden. Ich habe versucht, jedes Menüelement eine globale Variable, so dass ich sagen könnte: if (item.isSelected) { [item runAction:blah]; } Aber das hat nichts gebracht. Dies ist mein bisheriger Code:

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

Meine Frage ist: Wie kann ich den oben erwähnten Effekt erzielen? Ich möchte die ausgewählten CCMenuItem um 10 Pixel nach rechts zu rücken, wenn der Benutzer es berührt, aber nicht loslässt, und dann in seine normale Position zurückzukehren, wenn die Berührung dieses Menüelements beendet wird. Auch, wo sollte ich diese Animation Code setzen? In meinem init Funktion? Danke für die Hilfe

9voto

YvesLeBorg Punkte 8994

Wenn Sie das Standardverhalten des CCMenuItemLabel-Objekts ändern möchten, müssen Sie diese spezielle Klasse von cocos2d unterklassifizieren. Die Methoden, die Sie überschreiben müssen, sind

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

Die Methode "selected" wird aufgerufen, wenn der Finger das Etikett berührt. Die Methode "unselected" wird aufgerufen, wenn der Finger angehoben wird oder außerhalb des Etiketts gezogen wird. Ich habe Ihnen soeben einen (sehr) grundlegenden Ansatz für das Verhalten von "selected/unselected" gezeigt, experimentieren Sie damit. Es gibt Probleme mit dem Timing. Ich würde die Verwendung von Animationen für einen ersten Versuch vermeiden. Schauen Sie sich den Code in der Klasse CCMenuItemLabel an, wenn Sie ein Beispiel mit Animation sehen wollen.

7voto

NIKHIL Punkte 2725

Prüfen Sie die folgende Codezeile:

    CCMenuItem *item31 = [CCMenuItemImage itemFromNormalImage:@"btn_on.png" selectedImage:@"btn_on_hover.png"];
    CCMenuItem *item32 = [CCMenuItemImage itemFromNormalImage:@"btn_off.png" selectedImage:@"btn_off_hover.png"];
  • Wie im obigen Code können Sie die btn_on_hover.png so, dass es aussieht wie hat Offset von 10px auf der rechten Seite oder wo immer Sie wollen.
  • Da cocos2d quelloffen ist, können Sie Ihre Aufgabe auf vielen Wegen erreichen. CCMenu.h Klasse. Sie können Klasse nach Ihren Anforderungen ändern.
  • Sie können zum Beispiel folgende Änderungen in folgendem Codefragment vornehmen CCMenu.h Klasse.

        #pragma mark Menu - Touches
        #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED

Lassen Sie es mich wissen, wenn Sie Fragen haben. Mit freundlichen Grüßen, Neil.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X