2010-08-19 101 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