Так что я пытаюсь обнаружить столкновения между спрайтами в 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 является причиной сбоя. Как всегда, любая помощь или руководство очень ценится.
У вас нет сообщений на консоли, когда происходит сбой? Трассировка стека? –
Я добавлю все к вопросу. – gargantuan