我的情況是,我的應用程序中有幾個不同的迷你遊戲。遊戲以表格視圖列出,當選擇其中一個遊戲時,我創建相應的遊戲對象。我需要遊戲對象具有共同的父類,以便我可以執行常見的事情,例如暫停和恢復。目標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];
我大概有75%清楚爲什麼這項工作,但它確實,而且很容易。 – soleil 2013-03-15 20:28:43