I’m working through the ‘Learning Cocos2d’ book, and I’m stuck on something basic.
So, theres a parent Class: GameplayLayer. In it, there’s an ‘init’ method which creates an instance of the main character in here – ‘Viking’. Viking is a subclass of ‘GameCharacter’, which is a subclass of ‘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];
Now, Viking has an update method which is called every frame by GameplayLayer. It’s parent class, GameObject also has this update method, which brings up an error message if it is accidentally called – “GameObject update should be overridden’.
So in my code, I’m calling the update method of ‘Viking’ with the following method:
#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];
}
}
So, this is supposed to call the ‘updateStateWithDeltaTime’ method in Viking. But somehow, it’s calling the parent method in GameObject which says ‘updatestate should be overridden’. How do I override the parent method?
Many thanks,
Carl
You need to cast
tempCharto aViking.Because you’re doing a for loop with fast enumeration of
GameObjects, the local variable assumes that all objects areGameObjects. You need to explicitly casttempCharto aVikingso that the program knows which class to look for the method in.As an interesting side note, if
GameObjectdidn’t have the same method asVikingdid, you would be getting a warning in XCode telling you it couldn’t find the method you’re asking for (because it needs to know that every object this could be called on has it).You might want to check that the object you’re calling this on is the correct class (if you only want to call this on
Vikingobjects). You’d addif ([GameObject isKindOfClass[Viking class])above your update method call.