Подкласс Cocos2D MenuItem с Objective-C - PullRequest
2 голосов
/ 07 июля 2010

Я использую CCMenu в моем небольшом проекте, в нем три кнопки.Мне нужно, чтобы эти кнопки продолжали срабатывать, если они обнаруживают прикосновение, и, поскольку это ненормальное поведение, я решил создать подкласс CCMenuItem и переопределить несколько методов.:

-(void) selected
{
    // subclass to change the default action
    if(isEnabled_) { 
        [super selected];
        [self stopActionByTag:kZoomActionTag];
        originalScale_ = self.scale;
        CCAction *zoomAction = [CCScaleTo actionWithDuration:0.1f scale:originalScale_ * 1.2f];
        zoomAction.tag = kZoomActionTag;
        [self runAction:zoomAction];
    }
}

-(void) unselected
{
    // subclass to change the default action
    if(isEnabled_) {
        [super unselected];
        [self stopActionByTag:kZoomActionTag];
        CCAction *zoomAction = [CCScaleTo actionWithDuration:0.1f scale:originalScale_];
        zoomAction.tag = kZoomActionTag;
        [self runAction:zoomAction];
    }
}

Так что в моем подклассе я просто точно дублирую их, но заменяю код внутри новой функциональностью.Для простоты скажем:

-(void) selected
{
    //turn a sprite around
    mySprite.rotation = 0;
}

-(void) unselected
{
    //turn a sprite around
    mySprite.rotation = 180;
}

Теперь mySprite будет объявлен в заголовке кода основного тела, который импортируется в этот подкласс.

ПроблемаmySprite не виден, появляется ошибка undeclared.Вместо mySprite я должен использовать [super selected]?Я пробовал это, я получаю точно такую ​​же ошибку.

Спасибо.

1 Ответ

1 голос
/ 11 июля 2010

Прежде всего, да, вы должны использовать [super selected], если хотите, чтобы он выполнял поведение по умолчанию для пункта меню, а не просто копировал содержимое функции суперкласса. В случае с CCMenuItemLabel, который вы скопировали, вызов [super selected] позволит метке «делать свое дело» по отношению к визуальным эффектам, которые он делает при выборе. Это позволяет вам сконцентрироваться на том, что ВЫ хотите сделать.

Что касается того, почему ваш спрайт не виден, и какова может быть «необъявленная» ошибка, трудно сказать, не увидев код. Одной из проблем может быть то, что вы сказали, что подклассифицируете CCMenuItem, но вставляете в код CCMenuItemLabel.

Вы пробовали просто смотреть ccTouchesBegan и ccTouchesEnded прямо на вашем спрайте кнопки? Может быть, проще, чем пытаться заставить CCMenuItem сделать что-то, для чего он не был предназначен ...

Если это не удастся, загляните в «виртуальные джойстики», и вы получите хороший пример кода. На форумах Cocos2d было по крайней мере две основные темы на эту тему: Тема 1 Тема 2

...