2013-03-15 41 views
1

我的情況是,我的應用程序中有幾個不同的迷你遊戲。遊戲以表格視圖列出,當選擇其中一個遊戲時,我創建相應的遊戲對象。我需要遊戲對象具有共同的父類,以便我可以執行常見的事情,例如暫停和恢復。目標C遊戲類多態性

我有有一個通用的GameLayer財產通用GameScene類:

@interface GameScene : CCScene { 

} 

@property (nonatomic, strong) GameLayer* gameLayer; 

但是每個子類GameScene有它自己的類型GameLayer的。所以例如SuperMarioBros_GameScene有一個SuperMarioBros_GameLayer。當我初始化SuperMarioBros_GameScene出現的問題:

-(id) init 
{ 
    if((self = [super init])) { 
     self.gameLayer = (SuperMarioBros_GameLayer*)[SuperMarioBros_GameLayer node]; 
     [self addChild: self.gameLayer]; 

     SuperMarioBros_InputLayer *inputLayer = [SuperMarioBros_InputLayer node]; 
     inputLayer.delegate = self.gameLayer; //ERROR (see below) 
     [self addChild:inputLayer z:1 tag:2]; 
    } 
    return self; 
} 

通常,每個遊戲中還將有一個輸入層,其將發送UI消息到gameLayer。我得到這個錯誤:

Assigning to 'id <SuperMarioBros_FireDelegate> from incompatible type GameLayer* 

我明白這是發生,因爲SuperMarioBros_GameLayer實現<SuperMarioBros_FireDelegate>,但GameLayer沒有。

所以我的問題是如何讓GameScene類擁有一個可以是GameLayer的任何子類的多態屬性?請記住,每種類型的GameLayer都可以根據其相應的輸入層實現不同的協議?或者也許有更好的方法去解決這個問題?

同樣,最終目標是能夠從主遊戲控制撥打電話如

[currentGameScene pause]; 

這將反過來做這樣的事情:

[self.gameLayer pauseGameLoop]; 

回答

2

在實現文件SuperMarioBros_GameScene類,您可以覆蓋類擴展中gameLayer屬性的屬性聲明:

@interface SuperMarioBros_GameScene() 
@property (nonatomic, strong) SuperMarioBros_GameLayer *gameLayer; 
@end 

然後你不應該得到一個編譯器錯誤了。

這不會創建新的getter或setter函數(這些函數仍然在超類中調用),並且不會引入新的實例變量作爲後備存儲。它只告訴編譯器self.gameLayer是這個實現文件中的子類的一個實例。

+0

我大概有75%清楚爲什麼這項工作,但它確實,而且很容易。 – soleil 2013-03-15 20:28:43