2009-11-03 45 views
0

所以我試圖在cocos 2d中的sprites之間進行碰撞檢測。雖然我覺得我可能會問太多,因爲它崩潰,編譯器不會給我一個錯誤,iPhone模擬器只是凍結,然後放棄。有很多循環涉及,所以我猜測它太多了...但我不能確定。我對Cocos2d的碰撞檢測方法問得太多了嗎?

我的意圖是像這樣工作。

  • 每個Sprite都可以屬於一個碰撞組,所以我可以具體說明碰撞什麼。

  • 我有一個名爲collisionGroups的數組,其中包含該組中所有Sprites的數組。

  • 我有一個名爲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 

我已經完全不知道從哪裏開始的堆棧跟蹤。我所知道的是,在checkCollisions中添加for循環是導致崩潰的原因。 一如既往,任何幫助或指導是非常讚賞。

+0

發生崩潰時,控制檯上沒有任何消息?堆棧跟蹤? – 2009-11-03 20:29:51

+0

我會附加一切問題。 – gargantuan 2009-11-03 20:45:37

回答

3

collisionGroupscollisionPairs在創建它們時應該保留,否則它們將最終被運行循環中的autorelease池釋放。更改聲明爲:

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

當然,在-dealloc發佈它們。

+0

ahhhhh,對。內存管理對我來說是新的。謝謝。 – gargantuan 2009-11-03 20:57:46