2010-07-07 26 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錯誤。我應該使用[super selected]而不是mySprite?我試過這個,我得到了完全相同的錯誤。

謝謝。

回答

1

首先,是的,如果您希望它執行菜單項的默認行爲,而不是僅僅複製超類的函數的內容,那麼您應該使用[super selected]。在CCMenuItemLabel的情況下,您複製了該選項,調用[超級選定]將允許標籤針對它在選擇時的視覺效果「做它的事情」。這可以讓你專注於你想做的事情。至於爲什麼你的精靈不能被看到,以及「未聲明」的錯誤可能是什麼,很難說沒有看到代碼。一個問題可能是你說你正在繼承CCMenuItem,但是粘貼在CCMenuItemLabel代碼中。

您是否試過直接在您的按鈕精靈上觀看ccTouchesBegan和ccTouchesEnded?可能會比直接嘗試強制CCMenuItem做一些它並不真正被設計的事情更直接...

如果失敗,請查看「虛擬遊戲杆」,您應該獲得一些很好的示例代碼。 Cocos2d論壇至少有兩個主題:Thread 1Thread 2