0

私は「Learning Cocos2d」の本を読んでいますが、何か基本的なことに行き詰まっています。

そのため、親クラス: GameplayLayer があります。その中には、ここで主人公のインスタンス「バイキング」を作成する「init」メソッドがあります。Viking は、「GameObject」のサブクラスである「GameCharacter」のサブクラスです。

        #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 によってすべてのフレームで呼び出される update メソッドがあります。これは親クラスであり、GameObject にもこの更新メソッドがあり、誤って呼び出された場合、「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」メソッドを呼び出すことになっています。しかし、どういうわけか、「updatestate をオーバーライドする必要がある」という GameObject の親メソッドを呼び出しています。親メソッドをオーバーライドするにはどうすればよいですか?

どうもありがとう、

カール

4

1 に答える 1

-1

tempCharにキャストする必要がありVikingます。

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

の高速列挙で for ループを実行しているためGameObjects、ローカル変数はすべてのオブジェクトが であると想定しますGameObjects。メソッドを検索するクラスをプログラムが認識できるように、明示的tempCharに aにキャストする必要があります。Viking

興味深い補足としてGameObject、同じメソッドがVikingなかった場合、XCode で警告が表示され、要求しているメソッドが見つからないという警告が表示されます (これは、これが可能であるすべてのオブジェクトを知る必要があるためです)。呼び出される必要があります)。

これを呼び出しているオブジェクトが正しいクラスであることを確認したい場合があります (これをオブジェクトでのみ呼び出したい場合Viking)。if ([GameObject isKindOfClass[Viking class])update メソッド呼び出しの上に追加します。

于 2012-08-15T14:20:20.250 に答える