2009-11-03 2 views
0

그래서 나는 코코스 2d에서 스프라이트 간의 충돌 감지를하려고합니다. 내가 크래쉬하고 컴파일러가 내게 오류를주지 않는 것처럼 내가 너무 많이 요구하고 있다고 생각할지라도, 아이폰 시뮬레이터는 단지 멈추고 포기한다. 너무 많은 루핑이 포함되어있어 너무 많이 추측하고 있지만 확실하지는 않습니다.Cocos2d에 대한 충돌 감지 방법을 너무 많이 요구합니까?

내 의도는 이런 식으로 일하는 것이 었습니다.

  • 각 스프라이트는 충돌 그룹에 속할 수 있으므로 무엇과 충돌하는지에 대해 구체적으로 설명 할 수 있습니다.

  • 나는 그 그룹에있는 모든 스프라이트의 배열을 포함하는 collisionGroups라는 배열을 가지고있다.

  • I는 [1,3] [3,7] [1,7]와 같은 배열을 유지 collisionPairs라는 배열 ... 일정한 간격

  • 있고, I 모든 루프를 통해 원하는 collisionGroup 쌍 및 해당 그룹의 모든 스프라이트를 사용하여 기본 CGRectIntersectsRect를 확인합니다.

아아아, 컴파일러의 유용한 조언없이 충돌하는 곳입니다. 다른 방법으로이 작업을 시도하기 전에 루프를 돌리는 것이 너무 많다고 생각하는 것이 맞습니까? 아니면 다른 문제가 있습니까?

다음은 충돌 컨트롤러의 모든 코드입니다.

@implementation CollisionsController 

-(id) init 
{ 
    if((self == [super init])){ 

     int collisionCapacity = 10; 

     NSNotificationCenter *NC = [NSNotificationCenter defaultCenter]; 
     [NC addObserver:self selector:@selector(registerSpriteForCollisions:) name:@"REGISTER_SPRITE_FOR_COLLISIONS" object:nil]; 
     collisionGroups = [NSMutableArray arrayWithCapacity:collisionCapacity]; 
     collisionPairs = [NSMutableArray arrayWithCapacity:collisionCapacity]; 

     // fill up the arrays with Arrays to be used 
     for(int i = 0; i <= collisionCapacity; i++){ 
      NSNumber *dummyValue = [NSMutableArray arrayWithCapacity:100]; 
      [collisionGroups addObject:dummyValue]; 
     } 
    } 
    return self; 
} 

// ------------------------------------------------------------------------------------------------------------------------------------------------------------ 



-(void) registerSpriteForCollisions:(NSNotification *)sprite 
{ 

    GIAtlasSprite *cSprite = [sprite object]; 

    int colIndexInt = [cSprite getCollisionGroup]; 
    [[collisionGroups objectAtIndex:colIndexInt] addObject:cSprite]; 

} 



// ------------------------------------------------------------------------------------------------------------------------------------------------------------ 



-(void) handleCollisionsBetweenGroup:(int)groupA andGroup:(int)groupB 
{ 
    NSNumber *numberA = [NSNumber numberWithInt:groupA]; 
    NSNumber *numberB = [NSNumber numberWithInt:groupB]; 

    BOOL safeToAdd = YES; 

    for(NSArray *pair in collisionPairs){ 
     if(([pair objectAtIndex:0] == numberA && [pair objectAtIndex:1] == numberB) || ([pair objectAtIndex:0] == numberB && [pair objectAtIndex:1] == numberA)){ 
      safeToAdd = NO; 
      break; 
     } 
    } 

    if(safeToAdd){ 
     NSArray *pairArray = [NSArray arrayWithObjects:numberA, numberB, nil]; 
     [collisionPairs addObject:pairArray]; 
    } 

} 



// ------------------------------------------------------------------------------------------------------------------------------------------------------------ 



-(void) checkCollisions 
{ 

    for(NSArray *cp in collisionPairs){ 
     // WHEEEEEEEEE! CRASH! 
    } 

} 


@end 

스택 추적은 나에게주는 내가 어디에 스택 추적을 시작하는 절대적으로 아무 생각도 없어이

#0 0x936f768c in objc_msgSend 
#1 0x00006b1f in -[CollisionsController checkCollisions] at CollisionsController.m:90 
#2 0x00005359 in -[BownceLevel tick:] at BownceLevel.m:103 
#3 0x0004fc0d in -[Timer fire:] at Scheduler.m:87 
#4 0x000507a6 in -[Scheduler tick:] at Scheduler.m:215 
#5 0x0002ca51 in -[Director mainLoop] at Director.m:229 
#6 0x96e56483 in __NSFireTimer 
#7 0x903a98f5 in CFRunLoopRunSpecific 
#8 0x903a9aa8 in CFRunLoopRunInMode 
#9 0x31566600 in GSEventRunModal 
#10 0x315666c5 in GSEventRun 
#11 0x30a4eca0 in -[UIApplication _run] 
#12 0x30a5a09c in UIApplicationMain 
#13 0x000029a4 in main at main.m:13 

. 내가 아는 전부는 checkCollisions에 for 루프를 추가하는 것이 충돌을 일으키는 원인이다. 언제나 그렇듯이 도움이나 안내가 많은 도움을줍니다.

+0

충돌이 발생하면 콘솔에 아무런 메시지도 표시되지 않습니까? 스택 추적? –

+0

나는 모든 것을 질문에 추가 할 것이다. – gargantuan

답변

3

collisionGroupscollisionPairs은 생성 할 때 유지해야합니다. 그렇지 않으면 실행 루프의 자동 해제 풀에서 해제됩니다. ,

collisionGroups = [[NSMutableArray arrayWithCapacity:collisionCapacity] retain]; 
collisionPairs = [[NSMutableArray arrayWithCapacity:collisionCapacity] retain]; 

과 물론 -dealloc에서 그들을 해제 :에 선언을 변경합니다.

+0

아, 맞아. 메모리 관리는 저에게 새로운 것입니다. 감사. – gargantuan