2012-11-19 2 views
0

Bonne journée! J'utilise le moteur physique "chipmunk". Essayez de créer un objet dynamique en cliquant sur. AddBalls() crée le corps et la forme désirés. En cliquant il faut générer un nouvel objet et le mettre en tableau.Impossible d'ajouter un objet à NSMutableArray

-(void)AddBalls: (UIImageView *)image; 
{ 
    cpBody *ball2Body = cpBodyNew(100.0, INFINITY); 
    ball2Body->p = cpv(60, 250); 
    cpSpaceAddBody(space, ball2Body); 

    cpShape *ball2Shape = cpCircleShapeNew(ball2Body, 20.0, cpvzero); 
    ball2Shape->e = 0.5; 
    ball2Shape->u=0.2; 
    ball2Shape->data = (__bridge void*)image; 
    ball2Shape->collision_type = 1; 
    cpSpaceAddShape(space, ball2Shape); 

    [children addObject: (__bridge id)ball2Shape];//EXC_BAD_ACCESS code=1 
} 

-(void)setupChipmunk 

{ 
    cpInitChipmunk(); 
    space = cpSpaceNew(); 
    space->gravity = cpv(0, -100); 
    space->elasticIterations = 10; 

    [NSTimer scheduledTimerWithTimeInterval:1.0f/60.0f target:self selector:@selector(tick:) userInfo:nil repeats:YES]; 

    cpBody *ballBody = cpBodyNew(100.0, INFINITY); 
    ballBody->p = cpv(60,250); 
    cpSpaceAddBody(space, ballBody); 
    cpShape *ballShape = cpCircleShapeNew(ballBody, 20.0, cpvzero); 
    ballShape->e = 0.5; 
    ballShape->u = 0.8; 
    (ballShape->data) =(__bridge void*) ball; 
    ballShape->collision_type = 1; 
    cpSpaceAddShape(space, ballShape); 
} 

-(void)tick:(NSTimer *)timer 
{ 
    cpSpaceStep(space, 1.0f/60.0f); 
    cpSpaceHashEach(space->activeShapes, &updateShape, nil); 
} 

-(void) updateShape (void *ptr, void *unused) 
{ 
    cpShape *shape = (cpShape*)ptr; 

    if(shape == nil || shape->body == nil || shape->data == nil) { 
     NSLog(@"Unexpected shape please debug here..."); 
     return; 
    } 

    if([(__bridge UIImageView*)shape->data isKindOfClass:[UIView class]]) { 
     [(UIView *)((__bridge UIImageView*)shape->data) setCenter:CGPointMake(shape->body->p.x, 480 - shape->body->p.y)]; 
    } 
} 



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } else { 
     return YES; 
    } 
} 

- (void)handleTap:(UITapGestureRecognizer *)sender {  
    if (sender.state == UIGestureRecognizerStateEnded) { 
     [self AddBalls]; 
    } 
} 

Méthode AddBalls doit mettre une nouvelle forme dans le tableau. Mais j'ai eu l'erreur "EXC_BAD_ACCESS...". Que devrais-je faire? Merci

+1

Où est la définition de vos 'enfants'? Ce devrait être un objet 'NSMutableArray'. – sunkehappy

+0

Au-dessus d'un code total, j'ai défini les enfants comme NSMutableArray. En fait, ball2Shape est un objet de classe C. Mais j'utilise (__bridge id) pourtant ça n'aide pas – user1722231

Répondre

2

Vous ne pouvez pas lancer n'importe quel type à id, il doit en fait être un type Objective-C. Vous devrez envelopper le ball2Shape dans un NSValue.

[children addObject:[NSValue value:&ball2Shape withObjCType:@encode(cpBody*)]]; 

... 
//When you need to use/free the values 
for (NSValue *value in children) 
{ 
    cpBody *body = (cpBody*)[value pointerValue]; 

    //Use body like you did above. 

    //Even though it is ARC you will need to free cpBody since 
    // it is not an Objective-C object 
    cpBodyFree(body); 
} 
+0

Je l'essaie! Merci! – user1722231

+0

Qu'est-ce que 'cpBodyFree'? – sunkehappy

+0

https://github.com/slembcke/Chipmunk-Physics/blob/master/include/chipmunk/cpBody.h – Joe

Questions connexes