0

我正在阅读“Learning 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 也有这个 update 方法,如果不小心调用它会弹出一个错误消息——“GameObject update should be overridden”。

所以在我的代码中,我使用以下方法调用“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 中的父方法,上面写着“应该覆盖更新状态”。如何覆盖父方法?

非常感谢,

卡尔

4

1 回答 1

-1

您需要转换tempCharViking.

    for (GameObject *tempChar in listOfGameObjects) 
    {
        [(Viking *) tempChar updateStateWithDeltaTime:deltaTime
 andListOfGameObjects:listOfGameObjects];
    }

因为您正在执行一个快速枚举 的 for 循环GameObjects,所以局部变量假定所有对象都是GameObjects. 您需要显式tempChar转换为 aViking以便程序知道要在哪个类中查找该方法。

作为一个有趣的附注,如果GameObject没有与之前相同的方法Viking,您将在 XCode 中收到警告,告诉您它找不到您要求的方法(因为它需要知道每个对象这可能被称为有它)。

您可能想要检查您正在调用它的对象是否是正确的类(如果您只想在Viking对象上调用它)。您将if ([GameObject isKindOfClass[Viking class])在更新方法调用之上添加。

于 2012-08-15T14:20:20.250 回答