我的情况是我的应用程序中有几个不同的小游戏。游戏在表格视图中列出,当其中一个被选中时,我创建了相应的游戏对象。我需要游戏对象有一个共同的父类,这样我就可以做一些常见的事情,比如暂停和恢复。
我有一个通用的 GameScene 类,它有一个通用的 GameLayer 属性:
@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 消息。我收到此错误:
Assigning to 'id <SuperMarioBros_FireDelegate> from incompatible type GameLayer*
我知道这是因为 SuperMarioBros_GameLayer 实现<SuperMarioBros_FireDelegate>
了,但 GameLayer 没有。
所以我的问题是如何让 GameScene 类拥有可以是 GameLayer 的任何子类的多态属性?请记住,每种类型的 GameLayer 可能会根据其相应的输入层实现不同的协议?或者也许有更好的方法来解决这个问题?
同样,最终目标是能够从主游戏控制器进行调用,例如
[currentGameScene pause];
这反过来会做类似的事情:
[self.gameLayer pauseGameLoop];