我正在研究“学习Cocos2d”一书,我坚持一些基本的东西。
所以,这是一个父类:GameplayLayer。在其中,有一个'init'方法,在这里创建一个主角的实例 - 'Viking'。 Viking是'GameCharacter'的子类,它是'GameObject'的子类。
#pragma mark INIT PLAYER
Viking *viking = [[Viking alloc]
initWithSpriteFrame:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:@"viking.png"]];
[viking setJoystick:leftJoystick];
[viking setFireButton:fireButton];
[viking setSecondaryButton:secondaryButton];
[viking setCollisionLayer:collidableLayer]; // send collision layer to player
[viking setPosition:ccp(screenSize.width * 0.35f, screenSize.height * 0.14f)];
[viking setHealth:100];
[sceneSpriteBatchNode addChild:viking z:1000 tag:kPlayerSpriteTagValue];
现在,Viking有一个更新方法,每个帧都由GameplayLayer调用。它是父类,GameObject也有这个更新方法,如果意外调用它会显示一条错误消息 - “游戏对象更新应该被覆盖”。
所以在我的代码中,我用以下方法调用'Viking'的更新方法:
#pragma mark UPDATE_METHOD
-(void) update:(ccTime)deltaTime
{
CCArray *listOfGameObjects =
[sceneSpriteBatchNode children];
for (GameObject *tempChar in listOfGameObjects) {
CCLOG(@"engine found %@",tempChar);
[tempChar updateStateWithDeltaTime:deltaTime
andListOfGameObjects:listOfGameObjects];
}
}
所以,这应该在Viking中调用'updateStateWithDeltaTime'方法。但不知何故,它在GameObject中调用了父方法,它说'updatestate应该被覆盖'。如何覆盖父方法?
非常感谢,
卡尔
答案 0 :(得分:-1)
您需要将tempChar
投射到Viking
。
for (GameObject *tempChar in listOfGameObjects)
{
[(Viking *) tempChar updateStateWithDeltaTime:deltaTime
andListOfGameObjects:listOfGameObjects];
}
因为您正在使用GameObjects
的快速枚举执行for循环,所以局部变量假定所有对象都是GameObjects
。您需要将tempChar
显式地转换为Viking
,以便程序知道要在哪个类中查找该方法。
作为一个有趣的旁注,如果GameObject
没有与Viking
相同的方法,那么您会在XCode中收到警告,告诉您它无法找到你要求的方法(因为它需要知道可以被调用的每个对象都有它)。
您可能想要检查您正在调用此对象的对象是否是正确的类(如果您只想在Viking
个对象上调用它)。您可以在更新方法调用上方添加if ([GameObject isKindOfClass[Viking class])
。