2017-01-08 9 views
1

SKScene에 고정 된 SKPhysicsBody가 두 가지 있습니다. 이 둘의 유일한 차이점은 카테고리 BitMask입니다. 하나는 512의 categoryBitMask, 다른 1024SKPhysicsContact에서 bodyA 및 bodyB는 어떻게 결정됩니까?

내 프로그램에서
static const u_int32_t kWallCategory = 0x1 << 9;   //512 
static const u_int32_t kStructureCategory = 0x1 << 10; //1024 

, 나는이 시작 -(void)didBeginContact:(SKPhysicsContact *)contact에서 호출 표준 접촉 핸들러가 있습니다

-(void)handleContact:(SKPhysicsContact*)contact { 
    SKPhysicsBody *bodyA = contact.bodyA; 
    SKPhysicsBody *bodyB = contact.bodyB; 
    int type1 = contact.bodyA.categoryBitMask; 
    int type2 = contact.bodyB.categoryBitMask; 

를 내 프로그램에서을, 나는을 결정해야 동적 몸체와 두 개의 고정 된 몸체 중 하나 사이의 접촉 벡터. 이렇게하기 위해, 내가 눈치 무엇 SKPhysicsContact

CGVector c = contact.contactNormal; 

의 contactNormal 속성에 액세스하지만, 접촉 벡터가 일관성이 있다고하고 있었고, 난 가끔 SKPhysicsContact의 bodyA이 정체 되었기 때문이었다 결정 때로는 몸이 역동적 인 몸이었습니다.

예를 들어 총알 (역동적 인 몸체)이 왼쪽에서 건물 (고정 된 몸체)에 닿았을 때마다 나는 (-1,0)의 접촉 벡터를 원합니다. 현재, 연락처 벡터는 (-1,0) (왼쪽부터)이고 때로는 (1,0) (오른쪽부터)은 모두 몸체에 따라 달라집니다. contact.bodyA입니다.

내 질문 : bodyP와 bodyP를 결정하는 것은 SKPhysicsContact에서 무엇입니까?

답변

1

SKPhysicsBody (질량, 마찰 categoryBitmask 등)의 여러 측면 땜질 후, I는 SKPhysicsContact.bodyASKPhysicsContact.bodyB의 판정이 SKPhysicsBody 장면에 추가 될 때 단독기반 것을 확인했다

SKPhysicsBody *bullet 히트 SKPhysicsBody *building 왼쪽 :

예는 차이점을 강조한다.

케이스 1 : *building*bullet 전에 장면 에 첨가하면 SKPhysicsContact.contactNormal이다 : *building이다 (-1,0)SKPhysicsContact.bodyA 때문에, 따라서 접촉 벡터가 *building가 (즉, 왼쪽)에서 접촉되는 이다.

케이스 2 : *building*bullet 후 현장 에 첨가하면 SKPhysicsContact.contactNormal이다 : 따라서 접촉 벡터가 *bullet가 (즉, 오른쪽)에서 접촉되는 이다 지금 *bullet이다 (1,0)SKPhysicsContact.bodyA 때문에.

문제

때문에 *bullet*building 기관 내 프로그램에서 여러 번 추가, 난 항상, 더 중요한 것은, 방법은 계속하고 있었는지 SKPhysicsContact.bodyASKPhysicsContact.bodyB 알고하는 방법을 구현하는 데 필요한 SKPhysicsContact.contactNormal과 일치합니다.

솔루션

는 충돌이에서 을 오는 위치를 결정하는 데 필요로하는 SKPhysicsBody을 결정하고 접촉 처리기에서, 그 다음 physicsBody.categoryBitMask

static const u_int32_t kProjectileCategory = 0x1 << 1; //Dynamic body 
//Make everything with bitmask > 32 will be set for the fixed bodies 
static const u_int32_t kStructureCategory = 0x1 << 10; //Fixed body 

을 설정

-(void)handleContact:(SKPhysicsContact*)contact { 
//bodyA will be the SKPhysicsBody that was added to the SKScene before bodyB 
SKPhysicsBody *bodyA = contact.bodyA; 

//bodyB will be the SKPhysicsBody that was added to the SKScene after bodyA 
SKPhysicsBody *bodyB = contact.bodyB; 

int categoryBitmask1 = contact.bodyA.categoryBitMask; 
int categoryBitmask2 = contact.bodyB.categoryBitMask; 

CGVector v; 

//If the categoryBitmask of bodyA is lower, we will get the contact vector from the Dynamic body, which we don't want 
if (categoryBitmask1 < categoryBitmask2) 
{ 
    //Since we always want the contact vector determined FROM the fixed body (higher category bitmask), we have to get the reciprocal contact vector in the case that bodyA is the dynamic (non-fixed) body 
    v = CGVectorMake(contact.contactNormal.dx * -1, contact.contactNormal.dy * -1); 
} else { 
    //If the categoryBitmask 
    v = contact.contactNormal; 
} 
+1

이것은 대단한 선동입니다. 귀하의 연락처 처리기가하는 것에 대해 중요하다고 가정 할 때 어떤 신체가 어떤 신체인지 항상 테스트해야한다는 귀하의 결론은 그 길에 문제가 있습니다. 항상 테스트하는 이유는 어떤 신체 기관을 제어하기가 어렵지 않다는 것입니다 Apple은 신체 A와 B가 * 결정적 순서로 존재할 것이라고 약속하지 않습니다. 생성 순서와 상관 관계가 있지만 모든 장치와 OS 버전에서 동일하다는 보장은 없습니다. – rickster