2011-11-13 15 views
0

私は奇妙な問題があります。 私の選手のショットは、体に衝突すると問題なく破棄されますが、同時に2つの体に当たったときにクラッシュします。体の間で奇妙な接触

射撃選手

b2Body *shooting = [_lhelper newBodyWithUniqueName:@"shoot" world:_world]; 
CCSprite *shootingSprite = (CCSprite *)shootingBody->GetUserData(); 
shootingBody.position = pos; 
shootingBody->SetTransform(b2Vec2(pos.x/PTM_RATIO, 
           pos.y/PTM_RATIO), 
         CC_DEGREES_TO_RADIANS(angle)); 

接触

if([spriteA tag] == ENEMY && [spriteB tag] == SHOT) 
{ 


    int animIdx = [(NSNumber*)[spriteA userData] intValue]; 
    if(animIdx < 2) 
    { 
     [spriteA setTextureRect:MY_RECTS[animIdx]]; 
     [spriteA setUserData:[NSNumber numberWithInt:animIdx+1]]; 
    } 
    else 
    { 
     [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyA]]; 

    } 

    [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyB]]; 

} 
else if([spriteB tag] == ENEMY && [spriteA tag] == SHOT) 
{ 


    int animIdx = [(NSNumber*)[spriteB userData] intValue]; 

    if(animIdx < 2) 
    {   
     [spriteB setTextureRect:MY_RECTS[animIdx]];  
     [spriteA setUserData:[NSNumber numberWithInt:animIdx+1]]; 
    } 
    else 
    { 
     [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyB]]; 
    } 

    [objectThatWillBeDeleted addObject:[NSValue valueWithPointer:bodyA]]; 

} 

更新

std::vector<Contact>::iterator pos; 
for(pos = _contactListener->_contacts.begin(); 
    pos != _contactListener->_contacts.end(); ++pos) 
{ 
    Contact contact = *pos; 

    //[self checkBodies2:&contact];   

} 


for(NSValue* val in objectThatWillBeDeleted) 
{ 
    b2Body* body = (b2Body*)[val pointerValue]; 
    [_lhelper removeBody:body]; 
} 

    [objectThatWillBeDeleted removeAllObjects]; 
} 

}

私はどこにエラーを理解していません。

答えて

1

私はどこでクラッシュするのかを言わなかったので、どこでエラーが出るのか分かりません:) しかし、私はあなたが同じボディを2度破壊しようとしていると思います。

ショットが同じタイムステップで2つの敵にヒットした場合、ショットボディはオブジェクトのリストに2回追加されます。あなたは、あなたがその内容を破壊する前にそのリストをユニークにする必要があります。

+0

ありがとうございました。それを試みてください – user1007760

+0

同時に2つのボディに接触すると、同じボディの衝突コンタクトが2回報告されます。これは正常な動作です。 NSMutableSetを使用して、objectThatWillBeDeletedにタイプのオブジェクトが1つしか存在しないようにする必要があります。おそらく、そのボディを追加する前にそのボディの存在をNSMutableSetに問い合わせる必要があります。参照:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsmutableset_Class/Reference/NSMutableSet.html – LearnCocos2D

関連する問題