调用子类方法 - Cocos2d

时间:2012-08-15 13:54:18

标签: objective-c ios oop class cocos2d-iphone

我正在研究“学习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应该被覆盖'。如何覆盖父方法?

非常感谢,

卡尔

1 个答案:

答案 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])