Cocos2d CCMenuItem анимация на выбор

У меня есть CCMenu с 5 CCMenuItems. Когда пользователь касается элемента меню, я хочу, чтобы элемент меню сдвигался вправо на 10 пикселей, чтобы отличать его от других. Я попытался сделать каждый пункт меню глобальной переменной, чтобы я мог сказать: if (item.isSelected) { [item runAction:blah]; } Но это ничего не сделало. Это мой код до сих пор:

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

У меня вопрос: как мне добиться эффекта, о котором я говорил ранее? Я хочу выбранный CCMenuItem сдвинуть вправо на 10 пикселей, когда пользователь касается его, но не отпускает, а затем вернуться к своей обычной позиции, когда касание покидает этот пункт меню. Кроме того, где я должен поместить этот код анимации? В моем init функционировать? Спасибо за помощь

2 ответа

Решение

Если вы хотите изменить поведение "из коробки" объекта CCMenuItemLabel, вам нужно будет подразделить этот конкретный класс cocos2d. Методы, которые вам нужно будет переопределить:

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

Метод "выбранный" вызывается, когда палец касается этикетки. Метод "невыбранный" вызывается, когда палец поднимается или перетаскивается за пределы метки. Я только что показал вам базовый (очень) подход к выбранному / невыбранному поведению, поэкспериментируйте с ним. Есть временные проблемы. Я бы избежал использования анимации в качестве первой попытки, как это. Посмотрите код в классе CCMenuItemLabel, если вы хотите пример с анимацией.

Проверьте следующую буксирную линию кода:

    CCMenuItem *item31 = [CCMenuItemImage itemFromNormalImage:@"btn_on.png" selectedImage:@"btn_on_hover.png"];
    CCMenuItem *item32 = [CCMenuItemImage itemFromNormalImage:@"btn_off.png" selectedImage:@"btn_off_hover.png"];
  • Как и в приведенном выше коде, вы можете настроить btn_on_hover.png таким образом, чтобы он выглядел смещенным на 10 пикселей вправо или в любом месте.
  • Вы можете достичь своей цели многими способами, поскольку cocos2d является открытым исходным кодом. проверять CCMenu.h учебный класс. Вы можете изменить класс согласно вашему требованию.
  • например, вы можете внести изменения в следующем фрагменте кода в CCMenu.h учебный класс.

        #pragma mark Menu - Touches
        #ifdef __IPHONE_OS_VERSION_MAX_ALLOWED
    

Дайте мне знать в случае каких-либо запросов. С уважением, Нил.

Другие вопросы по тегам