2011-11-13 2 views
0

이상한 문제가 있습니다. 내 선수의 슛은 몸과 충돌 할 때 문제없이 파괴하지만, 한 번에 두 몸에 부딪 힐 때 충돌합니다.이상한 신체 접촉

촬영 선수

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

내가 어디에서 충돌했는지 말하지 않았기 때문에 어느 부분에서 오류인지 이해할 수 없습니다. 하지만 동일한 신체를 두 번 파괴하려고합니다.

같은 시간 단계에서 두 명의 적을 쳤을 때, 샷 본문은 두 개의 목표로 추가됩니다. 그 목록을 파괴하기 전에 그 목록을 고유하게 만들면됩니다.

+0

감사합니다. 그것을 시도하십시오 – user1007760

+0

동시에 두 개의 몸에 닿는다면 충돌 접촉은 같은 몸에 대해 두 번보고됩니다. 이것은 정상적인 동작입니다. NSMutableSet을 사용하여 objectThatWillBeDeleted에 유형의 객체 하나만 존재할 수 있도록해야합니다. 추가하기 전에 해당 본문의 존재 여부를 NSMutableSet에 쿼리해야 할 것입니다. 참조 : http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsmutableset_Class/Reference/NSMutableSet.html – LearnCocos2D