2009-11-03 1 views
0

Так что я пытаюсь обнаружить столкновения между спрайтами в cocos 2d. Хотя я думаю, что, возможно, я слишком много спрашиваю, когда он падает, и компилятор не дает мне ошибку, симулятор iPhone просто замерзает, а затем сдаётся. Там много циклов, поэтому я предполагаю, что это слишком много ... но я не могу быть уверен.Я прошу слишком много с моим методом обнаружения столкновений для Cocos2d?

Мое намерение состояло в том, чтобы работать так.

  • Каждый спрайт может принадлежать группе столкновений, поэтому я могу быть конкретным в отношении того, с чем сталкивается.

  • У меня есть массив под названием collisionGroups, который содержит массив всех спрайтов в этой группе.

  • У меня есть массив под названием collisionPairs, который содержит массивы как [1,3] [3,7] [1,7] ...

  • через регулярные промежутки времени, я хочу, чтобы перебрать все 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 

Я не имею ни малейшего понятия, с чего начать трассировку стека. Все, что я знаю, это то, что добавление цикла for в checkCollisions является причиной сбоя. Как всегда, любая помощь или руководство очень ценится.

+0

У вас нет сообщений на консоли, когда происходит сбой? Трассировка стека? –

+0

Я добавлю все к вопросу. – gargantuan

ответ

3

collisionGroups и collisionPairs следует сохранить при их создании, иначе они будут освобождены пулом автозапуска в цикле выполнения. Изменение заявления на:

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

и, конечно, выпустить их в -dealloc.

+0

ahhhhh, справа. Управление памятью для меня нова. Благодарю. – gargantuan

Смежные вопросы