Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Total
관리 메뉴

만재송

[Cocos Creator] Physics Manager 정복하기(2) - 메서드 본문

프로그래밍/COCOS Creator

[Cocos Creator] Physics Manager 정복하기(2) - 메서드

만재송 2018. 7. 26. 11:16

Physics Manager 메서드


해당 화면에 있는 물리 객체들의 정보를 알고 싶을 때도 있습니다. 예를 들어, 폭탄이 폭팔하면 범위 내의 물체를 손상시킬수도 있고, 유저가 드래그하여 캐릭터를 이동시킬수도 있습니다. 또한 주변에 있는 물체를 효율적이고 신속하게 찾을 수 있는 방법을 제공합니다. Physics Manager 는 이러한 장면을 쉽게 만들 수 있는 기능을 제공하고 있습니다.



Point Test


포인트 테스트는 특정 좌표에 포함된 Physics Component가 있는 노드가 있는지 테스트합니다. 테스트에 성공하면 해당 노드의 Physics Component 객체를 반환합니다. 단, 여기서 좌표는 Canvas 좌표가 아닌 절대좌표(왼쪽아래가 0,0) 을 사용하므로 이점에 유의해 주시기 바랍니다.


테스트를 위해 마우스에 터치 이벤트를 추가하여 Physics Component가 있는 노드를 클릭 했을 때 콘솔에 Coliider 정보를 출력하는 예제를 만들어 보겠습니다. 첫번째 파트에서 만든 프로젝트를 가지고 사용하겠습니다. 원할한 테스트를 위해 중력은 0으로 설정하겠습니다.


this.physicsManager.gravity = cc.v2(0, 0);


다음으로 터치 이벤트를 추가합니다. 터치가 일어날때 onTouched 콜백함수를 실행하는 이벤트를 추가합니다.


this.node.on(cc.Node.EventType.TOUCH_START, this.onTouched.bind(this));


이제 onTouched 함수를 아래와 같이 작성합니다.


onTouched: function (event) {
var touchPoint = event.getLocation();
var collider = this.physicsManager.testPoint(touchPoint);
console.log(collider);
}


터치이벤트를 사용하면 콜백 파라미터에 event 객체를 받게됩니다. event 객체는 여러정보가 담기게 되는데 그중, event.getLocation() 로 현재 터치한 좌표를 가져올 수 있습니다. 그다음 Physics Manager 에 있는 testPoint 메서드를 사용하여 Coliider 정보를 가져올 수 있습니다. 파라피터는 1개이며 포인트 값을 전해줍니다. 만약 현재 클릭한 위치에 Physics Component가 있는 노드 가 있으면 Coliider 정보를 출력하겠죠?? 테스트를 실행하면 아래와 같이 정보를 출력하게 됩니다.



Rect Test


사각형 테스트는 파라미터로 전해준 Rect 값안에 포함된 Physics Component가 있는 노드가 있는지 테스트합니다. 테스트에 성공하면 해당 노드의 Physics Component 객체를 배열로 반환합니다. 여기 또한 좌표는 절대좌표를 사용합니다.


Rect Test 는 범위 안에 있는 모든 객체를 가져오기 때문에 배열로 반환합니다. 예시로 canvas 크기의 가상의 사각형을 만들어 값을 반환하는지 테스트 하겠습니다. 


isCollidedInCanvas: function (rect) {
var canvasRect = cc.rect(0, 0, cc.director.getWinSize().width, cc.director.getWinSize().height);
var colliderList = this.physicsManager.testAABB(canvasRect);
console.log(colliderList);
}


먼저 canvas 크기만큼의 가상의 사각형을 만듭니다. 생성은 cc.rect로 하며 인자값은 차례대로 x, y, width, height 입니다. 다음 Physics Manager 에 있는 testAABB 메서드를 사용하여 Collider 정보를 가져옵니다. 값은 포함된 객체가 있다면 배열로 가져오고 그렇지 않으면 빈 배열로 가져옵니다. 테스트를 실행하면 아래와 같습니다.



cc.Class({
extends: cc.Component,

properties: {

},

onLoad: function () {
// physics manager 활성화
this.physicsManager = cc.director.getPhysicsManager();
this.physicsManager.enabled = true;

/**
* e_shapeBit = 0x0001 // Shape 영역을 나타내는 그림
* e_jointBit = 0x0002 // 조인트를 나타내는 그림
* e_aabbBit = 0x0004 // 바운딩 박스를 그림
* e_pairBit = 0x0008 // 연결된 오브젝트의 중심과 라인을 그림
* e_centerOfMassBit = 0x0010 // 오브젝트 중심을 그림
*/
var bits = cc.PhysicsManager.DrawBits;
// 디버그 모드 활성화
this.physicsManager.debugDrawFlags = bits.e_aabbBit | bits.e_pairBit |
bits.e_centerOfMassBit | bits.e_jointBit | bits.e_shapeBit;

// 디버그 모드를 사용하고싶지 않을 때
// this.physicsManager.debugDrawFlags = 0;

// 중력 설정
// x,y 값을 변경하여 중력을 변경할 수 있다. 기본값은 cc.v2(0, -320)
this.physicsManager.gravity = cc.v2(0, 0);

// timestep 설정
// 물리 시스템은 timestep 에 따라 물리 세계를 업데이트한다. 기본 timestep은 1 / framerate.
// timestep 설정 활성화
this.physicsManager.enabledAccumulator = true;

// 고정된 timestep 설정, 기본값은 1/60 이다.
this.physicsManager.FIXED_TIME_STEP = 1/30;

// 업데이트당 물리 속도 처리 반복횟수. 기본값은 10이다.
this.physicsManager.VELOCITY_ITERATIONS = 10;

// 업데이트당 물리 이동 처리 반복횟수. 기본값은 10이다.
this.physicsManager.POSITION_ITERATIONS = 10;

this.node.on(cc.Node.EventType.TOUCH_START, this.onTouched.bind(this));
},

start: function () {
this.isCollidedInCanvas();
},

onTouched: function (event) {
// 현재 화면에 터치한 좌표를 저장
var touchPoint = event.getLocation();
// 터치한위치에 physics 컴포넌트가 있는 객체가 있는지 확인. 있으면 physicsCollider 컴포넌트 객체를 반환
var collider = this.physicsManager.testPoint(touchPoint);
console.log(collider);
},

isCollidedInCanvas: function (rect) {
var canvasRect = cc.rect(0, 0, cc.director.getWinSize().width, cc.director.getWinSize().height);
var colliderList = this.physicsManager.testAABB(canvasRect);
console.log(colliderList);
}
});




Comments