我对Cocos2d的碰撞检测方法要求太多了吗?

时间:2009-11-03 20:20:11

标签: iphone cocoa-touch cocos2d-iphone

所以我试图在cocos 2d中的精灵之间进行碰撞检测。虽然我认为我可能会因为崩溃并且编译器没有给我一个错误而要求太多,但iPhone模拟器只是冻结然后放弃了。有很多循环涉及,所以我猜它太多了......但我不能肯定。

我的目的是像这样工作。

  • 每个Sprite都可以属于一个碰撞组,所以我可以具体说明碰撞的是什么。

  • 我有一个名为collisionGroups的数组,它包含该组中所有Sprite的数组。

  • 我有一个名为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

Stack trace给我这个

#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循环是导致崩溃的原因。 与往常一样,任何帮助或指导都非常受欢迎。

1 个答案:

答案 0 :(得分:3)

创建它们时应保留

collisionGroupscollisionPairs,否则它们将最终被运行循环中的自动释放池释放。将声明更改为:

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

当然,请在-dealloc中发布它们。