2010-08-19 4 views
1

친구들 나는 일반적으로 cocos2d 프로그래밍과 Mac을 처음 사용합니다!iphone cocos2d CCSprite EXC_BAD_ACCESS

내가 내 시간의 대부분을 망치고이 EXC_BAD_ACCESS 오류를 발견했습니다

는 ... 내가 AddEnemyAtX: Y: 전화,

여기
-(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 사방 전역 변수와 접근 ... Geek & Dad's tutorial에서 다음 코드 조각을 가지고 좌표를 전달하십시오. 내 문제는 처음 루프가 잘 실행됩니다 ...하지만 컨트롤이 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과 함께 사용할 때 노드의 부모 ID를 호출 한 객체에 전달합니다!

1

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

당신에게 오토 릴리즈 객체를 제공합니다.

이 제거 : 이것은 당신이 enemy1=nil

을 설정 한 후 animateEnemy에 nil을 제공하기 때문에 당신이 [self animateEnemy:enemy1];

할 수 없습니다

[enemy1 release]

, 2를 호출해서는 안 의미 [enemy1 release];enemy1 = nil;

코드에서 문제를 해결해야합니다.

+0

thanx parceval ... 그것은 실수였습니다. 실제로 실수가있었습니다. 코드는 수정 된 코드 였으므로 Sprite를 Array에 저장하여 참조 문제가 발생할 수 있습니다. 해결! 코드 조각 정정을 검색하고 PLZ – JaVadid

+0

셀렉터 이 있어야합니다 @selector이 (animateEnemyFinished :) 콜론 코드에없는 을 의미 잘못 ... 그것을 언급하는 이동 작업은 알 수없는 방법을 완료 할 때 라고 불렀다. 그게 그 추락의 이유 야. – parceval

+0

죄송합니다. 다시 오식 오류! 나는 실제 스 니펫을 나타 내기 위해 지금 질문을 편집했다 !!! 다시 미안! – JaVadid