post list

2014년 9월 7일 일요일

SKPhysicsbody클래스 충돌,접촉, 비트 마스크


물리몸체에 body를 할당하면 자동으로  물리 몸체 끼리 충돌,접촉에관한 설정이 이루어 집니다.

물리엔진이은 물리 운동을 2가지 방법으로 처리 합니다.

1.두 body가 겹쳐지는 것을 막는 것이 충돌입니다.
2. 두 body가 겹쳐지거나  붙을 경우 접촉이라고 합니다.


따로 설정을 바꾸지 않았을 경우에  모든 물리 몸체사이에 충돌이 일어나고  접촉은 일어나지 않습니다.
그러나 코딩을 할때는 어떤 경우에는 충돌이 일어나지 말아야하고 , 접촉이 일어나야 하는 경우가 있습니다. 이것을 처리하기 위해서 3가지의 bit mask를 이용합니다.

categoryBitMask

default  0xFFFFFFFF (all bit set)

collisionBitMask

default  0xFFFFFFFF (all bit set)

contactTestBitMask

default  0x00000000 ( all bit cleared) 

접촉 처리는 
SKPhysicsContactDelegate 의 두 메소드를 사용합니다. 

Responding to Contact Events


충돌이 일어나기 위해서는
bodyA 의 collisionbitmask 와  bodyB의 categoryBitMask 를 &연산한 결과가
0이 아닐경우입니다.

접촉이 일어나기 위해서는
bodyA의 category bit mask 와 bodyB의 contactTest bit mask 를 & 연산한 결과가
0이 아닐 경우 입니다.

======== 예시 ========
typedef NS_OPTIONS(int, EntityCategory) {
    
    EntityCategoryOne = 0x1   <<0,
    EntityCategoryTwo = 0x1   <<1,
    EntityCategoryThree =0x1  <<2,
    EntityCategoryFour = 0x1 <<3,
    

};

body1.physicsbody.categorybitmask = entitycategoryOne;
body2.physicsbody.categorybitmask = entitycategoryTwo;
body3.physicsbody.categorybitmask = entitycategoryThree;
body4.physicsbody.categorybitmask = entitycategoryFour;

//body1은  body2,body3와 충돌
body1.physicsbody.collisionbitmask = entitycategoryTwo | entitycategoryThree;

//body2 는 body2, body 4와 충돌 이때  body1과 충돌하지 않음
body2.physicsbody.collisionbitmask = entitycategoryTwo | entitycategoryFour;

 //body1과 body3이 접촉   이때 body3가 움직여서 접촉해야 접촉이 일어남
// body1 이 bodyA ,  body3이  bodyB
body3.physicsbody.contactTestbitmask = entitycategoryOne;




-(void) didBeginContact:(SKPhysicsContact *)contact
{
    SKSpriteNode* firstNode, *secondNode;
    
    firstNode = (SKSpriteNode*) contact.bodyA.node;
    secondNode = (SKSpriteNode*) contact.bodyB.node;
    
    if ((contact.bodyA.categoryBitMask == EntityCategoryOne)
        && (contact.bodyB.categoryBitMask == EntityCategoryThree)) {
        
        //접촉 처리
        
        
    }
    
}    
============================






댓글 없음:

댓글 쓰기