물리몸체에 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)) {
//접촉 처리
}
}
============================