2010-08-19 91 views
1

朋友我是新来的cocos2d编程和一般的Mac!iphone cocos2d CCSprite EXC_BAD_ACCESS

我已经注意到这个错误EXC_BAD_ACCESS毁了我大部分的时间...采取从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]; 
} 

这里_player是一个全局变量和访问无处不在,我呼吁AddEnemyAtX: Y:并传递一些坐标。我的问题是第一次循环运行正常......但再次当控制从animateEnemyFinished传递到animateEnemy时,那么应用程序崩溃提到“EXC_BAD_ACCESS”!

从我的想法出发,Sprite引用无法正确传递!帮帮我!

回答

1

哇! Atlast想通了......

一个小失误......只是

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

的伎俩更换线

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

!我从中得到的理解是,@selector()传递了调用它的对象的id,但同时我们将它与CCCallFuncN一起使用,它将Node的父节点id传递给调用它的对象!

1

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

给你一个自动释放的对象。这意味着你不应该叫

[enemy1 release]

和第二设置 enemy1=nil

后,你不能这样做 [self animateEnemy:enemy1];

,因为你给零到animateEnemy:

删除 [enemy1 release]; and enemy1 = nil;

从你的代码应该可以解决你的问题。

+0

thanx parceval ...这是我的错误,实际上我给了错误的混合片段...该代码是我用来存储在一个数组的精灵的修改后的代码,以便我面对的参考问题可以解决了!! 请找到片段纠正,它PLZ评论... – JaVadid 2010-08-19 07:38:18

+0

的选择是错误的 它必须是@selector(animateEnemyFinished :) 结肠代码中的丢失,意味着当移动动作完成未知方法被称为。这就是事故的原因。 – parceval 2010-08-19 19:52:27

+0

对不起老兄!再次输入错误!我现在编辑了这个问题来代表实际的片段!对不起,兄弟! – JaVadid 2010-08-20 09:38:16