2010-08-19 6 views
1

Amis je suis nouveau à la programmation cocos2d et Mac en général!iphone cocos2d CCSprite EXC_BAD_ACCESS

Je l'ai remarqué cette erreur de EXC_BAD_ACCESS ruinant la plupart de mon temps ... Prenez l'extrait suivant du code de l'Geek & Dad's tutorial ...

-(void) AddEnemyAtX:(int)x Y:(int)y { 
    CCSprite *enemy1 = [CCSprite spriteWithFile:@"enemy1.png"]; 
    enemy1.position = ccp(x,y); 
    [self addChild:enemy1]; 
    [self animateEnemy:enemy1]; 
    NSLog(@"%@", enemy1); 
} 

-(void) animateEnemy:(CCSprite *)enemy { 
    ccTime actualDuration = .5; 
    id actionMove = [CCMoveBy actionWithDuration:actualDuration 
      position:ccpMult(ccpNormalize(ccpSub(_player.position,enemy.position)), 10)]; 
    id actionFinished = [CCCallFunc actionWithTarget:self 
      selector:@selector(animateEnemyFinished:)]; 
     [enemy runAction:[CCSequence actions:actionMove,actionFinished,nil]]; 
} 

-(void) animateEnemyFinished:(id)sender { 
    CCSprite *enemy = (CCSprite *)sender; 
    [self animateEnemy:enemy]; 
} 

ici _player est une variable globale et accessible partout, j'appelle AddEnemyAtX: Y: et passez quelques coordonnées. Mon problème est la première fois que la boucle tourne bien ... Mais encore une fois lorsque le contrôle est passé de animateEnemyFinished à animateEnemy alors l'application se bloque en mentionnant "EXC_BAD_ACCESS"! De ce que j'ai compris, la référence de Sprite n'est pas passée correctement! Aidez-moi!

Répondre

1

Wow !! Atlast figured it out ...

Une petite erreur ... juste remplacer la ligne

id actionFinished = [CCCallFunc actionWithTarget:self 
      selector:@selector(animateEnemyFinished:)]; 

avec

id actionFinished = [CCCallFuncN actionWithTarget:self 
      selector:@selector(animateEnemyFinished:)]; 

a fait l'affaire! Ce que j'ai compris de ceci était que @selector() passe l'id de l'objet qui l'a appelé mais en même temps quand nous l'utilisons avec CCCallFuncN il passe l'identifiant du Node juste parent à l'objet qui l'a appelé!

1

CCSprite *enemy1 = [CCSprite spriteWithFile:@"enemy1.png"];

vous donne un objet autoreleased. Cela signifie que vous ne devez pas appeler

[enemy1 release]

et 2 après avoir défini enemy1=nil

vous ne pouvez pas faire [self animateEnemy:enemy1];

parce que vous donnez à zéro animateEnemy:

Suppression [enemy1 release]; et enemy1 = nil;

de votre code devrait résoudre votre problème.

+0

thanx parceval ... C'était mon erreur, en fait j'avais donné le mauvais fragment mélangé ... Ce code était le code modifié que j'avais utilisé pour stocker les sprites dans un tableau afin que le problème de référence que je faisais face puisse être résolu S'il vous plaît trouver l'extrait corrigé et plz la commenter ... – JaVadid

+0

le sélecteur est faux il doit être @selector (animateEnemyFinished :) le côlon est manquant dans votre code, signifie que lorsque l'action de déplacement a terminé une méthode inconnue a été appelé. C'est la raison de l'accident. – parceval

+0

Désolé mec !! encore une erreur typo !! J'ai édité la question maintenant pour représenter l'extrait réel !!! désolé encore mec !!! – JaVadid

Questions connexes