이 글은 PC 버전 TISTORY에 최적화 되어있습니다.
서론
Cocos Creator는 물리 처리에 대해 두 가지를 지원합니다. 하나는 저번 포스트에서 다뤘던 Collision Manager 그리고 오늘 다룰 Physics Manager입니다. Physics Manager는 다룰 내용이 많기 때문에 여러번에 걸쳐 포스트 하도록 하겠습니다.
3. Physics Manager3-1. RigidBody3-2. Physics Collider Component3-3. Contact (충돌처리)3-4. Joint
Physics Manager
Cocos Creator Physics Manager는 Box2D를 물리엔진으로 사용하고 있습니다. 사용자에게는 Box2D에 대한 세부 구현을 숨기고 Box2D 기능의 대부분을 Physics Manager를 통해 쉽게 접근할 수 있게 해줍니다.
Physics Manager 세팅
Physics Manager 사용
Physics Manager (이후론 물리 관리자로 편하게 부르도록 하겠습니다.) 는 기본적으로 비활성화되어 있습니다. 물리 시스템 관련 함수를 사용할 때 먼저 해야 할 일은 물리 관리자를 활성화하는 것입니다. 활성화 후부터 물리 객체가 물리 시스템의 영향을 받게 됩니다. 활성화는 다음의 문법으로 합니다.
cc.director.getPhysicsManager().enabled = true;
cc.director.getPhysicsManager().enabled = true;
물리 관리자를 비활성화/활성화 했을 때 물리 객체가 중력의 영향을 받는지 테스트
물리 시스템은 기본적으로 디버깅 정보를 그려 내지 않습니다. debugDrawFlags를 설정하면 디버깅 정보를 그릴 수 있습니다. 물리 시스템은 다양한 디버깅 정보를 제공하며 정보를 결합하여 관련 내용을 그릴 수 있습니다.
cc.director.getPhysicsManager().debugDrawFlags = cc.PhysicsManager.DrawBits.e_aabbBit |
cc.PhysicsManager.DrawBits.e_pairBit |
cc.PhysicsManager.DrawBits.e_centerOfMassBit |
cc.PhysicsManager.DrawBits.e_jointBit |
cc.PhysicsManager.DrawBits.e_shapeBit;
드로잉 플래그를 0
로 설정하여 디버깅을 비활성화합니다.
cc.director.getPhysicsManager().debugDrawFlags = 0;
aabb 충돌 범위(rect)과 shapeBit(circle collider)이 디버깅되고 있음
중력은 물리에서 가장 많이 쓰이는 부분입니다. 대부분의 물리 사용 게임은 중력을 중요한 특징으로 사용합니다. 중력이 약 1초당 -10 가속도로 떨어진다고 생각했을 때 픽셀로는 -320 픽셀이 떨어진다고 생각할 수 있습니다. (1m = 320pixel) 그렇기 때문에 기본 중력을 나타내려면 y값을 -320픽셀로 지정해주면 되겠죠.
중력을 0으로하려면 다음과 같이 설정하면됩니다.
cc.director.getPhysicsManager().gravity = cc.v2 ();
320픽셀/s^2로 지정하게되면 현실적인 중력을 구현할 수 있습니다.
cc.director.getPhysicsManager().gravity = cc.v2 (0, -320);
유용한 메서드
게임 내에서 물리 객체를 탐지하고 싶을 때가 있을 것입니다. 예를 들어, 폭탄이 폭발하면 범위 내의 물체가 충돌되어 튕겨나가거나 또는 전략 게임에서 사용자가 드래그하여 유닛들을 선택할 수 있어야하겠죠. 물리 관리자는 우리의 이런 요구를 충족시킬 수 있는 몇가지 메서드를 지원합니다.
Point 테스트는 월드 좌표계 아래에 특정 좌표가 포함 된 충돌 객체가 있는지 테스트합니다. 테스트가 성공적이면 Collider 정보를 반환합니다. 점이 포함 된 여러 충돌 객체가 있으면 임의의 충돌 객체가 반환됩니다.
var collider = cc.director.getPhysicsManager().testPoint(point);
collider가 있는 부분을 클릭 했을 때 collider가 있는 것을 체크할 수 있음
직사각형 테스트는 콜리더의 경계 상자와 교차하는 (직각 좌표계에서) 지정된 직사각형이 있는지 테스트합니다. 성공하면 콜 리더가 반환 목록에 추가됩니다.
var colliderList = cc.director.getPhysicsManager().testAABB(rect);
일명 Raycast는 설정된 라인이 통과하는 Collider를 검출하는 데 사용됩니다. 주어진 선이 지나가는 지점에서 법선 벡터와 다른 유용한 정보를 얻을 수 있습니다. (주의 - 캔버스의 anchor가 (0.5, 0.5)라면 rayCast의 (0, 0)은 캔버스의 중간이 아닌 좌측 하단부터 (0, 0)으로 인지합니다.)
var results = cc.director.getPhysicsManager().rayCast (p1, p2, type);
for (var i = 0; i <results.length; i ++) {
var result = results [i];
var collider = result.collider;
var point = result.point;
var normal = result.normal;
var fraction = result.fraction;
}
Raycast
함수 의 마지막 매개 변수는 탐지 유형을 지정하고 네 가지 유형을 지원합니다. 이는 Box2d의 광선 탐지가 광선 시작점의 가장 가까운 객체에서 감지되지 않기 때문에 결과가 광선의 시작 근처에서 객체와의 거리별로 정렬되는 것을 보장 할 수 없습니다. Cocos Creator의 물리 시스템은 Box2d 테스트 결과가 탐지 유형에 따라 정렬되는지 여부를 결정합니다. 이 유형은 결과 리턴에 영향을 미칩니다.
cc.RayCastType.Any :
광선 경로상의 모든 충돌자를 감지합니다. 충돌 장치를 감지하면 즉시 감지 프로세스가 끝나고 더 이상 다른 개체를 감지하지 않습니다. 보장할 수 없기 때문에 항상 가장 가까운 충돌체를 감지하지 않습니다.cc.RayCastType.Closest : 광선 경로에서 가장 가까운 충돌자를
rayCast
탐지합니다. 위의 방법보다 약간 느립니다.
cc.RayCastType.All
: 광선 경로의 모든 Collider들을 탐지합니다. 탐지 결과는 순서가 보장되지 않습니다. 여러 충돌체를 반환할 수 있습니다. 광선이 b2Fixture 탐지를 실행하고 충돌체가 여러 b2Fixture로 구성 될 수 있기 때문입니다. 이것은 비용이 많이 드는 방법이며 위의 방법들보다 느립니다. Physics Collider Component 포스트에서 확인하세요.
cc.RayCastType.AllClosest
: 광선 경로에있는 모든 Collider가 감지되지만 결과는 각 Collider의 가장 가까운 점에대한 관련 정보만 필터링되어 반환됩니다. 가장 느린 유형입니다.
|
|
cc.RayCastType.Closest |
cc.RayCastType.Any |
|
|
cc.RayCastType.All |
cc.RayCastType.AllClosest |
광선 검출의 결과에는 많은 유용한 정보가 포함되어 있으므로 필요에 따라 정보들을 활용할 수 있습니다.
collider
: 광선이 통과한 collider 객체
point
: 광선이 교차한 점
normal
: 교차점의 표면에서의 법선 벡터(교차점의 Collider 직선기준으로 수직선분)
fraction
: 광선의 시작점과 끝 사이에서 얼마나 곱해야 교차점에 도달할 수 있는지 수치를 나타냅니다. 아래 그림에서는 p1, p2 사이의 60%정도의 거리에 교차점이 위치하여 0.6이라는 수치를 보여줍니다.
다음 그림을 통해 광선 감지 결과를 더 잘 이해할 수 있습니다.
'Frontend > Cocos Creator' 카테고리의 다른 글
[Cocos Creator] Facebook Instant Games 개발하기 (3) | 2018.05.30 |
---|---|
[Cocos Creator Particle System] 1. Particle Editor 사용하기 (0) | 2018.02.12 |
[Cocos Creator 물리] 3-2. Physics Collider Component (2) | 2018.02.05 |
[Cocos Creator 물리] 2. Collision Manager (1) | 2018.02.01 |
[Cocos Creator] ListView 개념 및 사용 (0) | 2018.01.29 |
[Cocos Creator] Layout 개념 및 사용 예시 (0) | 2018.01.29 |