2010-07-07 2 views
2

В моем маленьком проекте я использую CCMenu, у него есть три кнопки. Мне нужно, чтобы эти кнопки продолжали запускать, если они обнаруживают прикосновение, и, поскольку это не нормальное поведение, я решил подклассифицировать CCMenuItem и переопределить несколько методов.Подкласс Cocos2D MenuItem с Objective-C

Два метода Я хочу переопределить, являются:

-(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

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

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

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

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