Collider
2022. 12. 28. 17:41ㆍ개인공부/Win32API
충돌기능을 구현하기 위해서는 충돌 크기를 설정해야 하는데 실제 게임 할 때는 필요 없지만 디버깅 과정에서는 충돌구역이 표시되면 편리하기 때문에 비행기와 미사일에 충돌구역을 가시화했다.
게임에서 충돌은 어떤 방식으로 구현할까?
충돌을 구현하는 방법으로는 오브젝트에 충돌되는 오브젝트와 충돌하지 않는 오브젝트를 설정하여 상속하는 방법도 있지만 이 방법으로는 예외상황을 처리하는데 어려움이 있기 때문에 컴포넌트 구조를 활용하면 좋다 컴포넌트 구조는 장착하고 해제하는 방식으로 오브젝트가 충돌 컴포넌트를 포함하면 충돌하는 방식이다.
각각의 오브젝트에서 대해서 충돌을 계산하면 연산이 과정이 길어지므로 같은 구성원끼리는 충돌하지 않는 방식으로 설계를 했다. 이러식으로 설계를 하면 새로운 씬에 들어갈 때 각각의 오브젝트그룹이 다른 그룹과 충돌을 계산할지 설정한다. 이 과정에서 비트 연산자를 활용하여 충돌하는 그룹끼리는 1 값을 대입하여 설계하였다.
그룹의 물체가 충돌체를 가지고 있다면 다른 충돌체를 가지는 구성원과 충돌하는지 함수를 통해서 충돌여부를 파악하면 되는데 이 과정은 다음 강의에서 배울 예정이다.
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
|
class CCollider
{
private:
static UINT g_iNextID;
CObject* m_pOwner; // collider 를 소유하고 있는 오브젝트
Vec2 m_vOffsetPos; // 오브젝트로 부터 상대적인 위치
Vec2 m_vFinalPos; // finalupdate 에서 매 프레임마다 계산
Vec2 m_vScale; // 충돌체 크기
UINT m_iID; // 충돌체 고유한 ID 값
public:
void SetOffsetPos(Vec2 _vPos) { m_vOffsetPos = _vPos; }
void SetScale(Vec2 _vScale) { m_vScale = _vScale; }
Vec2 GetOffsetPos() { return m_vOffsetPos; }
Vec2 GetScale() { return m_vScale; }
public:
void finalupdate();
void render(HDC _dc);
CCollider();
~CCollider();
friend class CObject;
};
|
cs |
충돌체는 고유의 아이디를 가진다 static 의 특징을 이용하면 아래와 같이 고유의 id값을 가질 수 있다
1
2
3
4
5
|
CCollider::CCollider()
:m_pOwner(nullptr)
, m_iID(g_iNextID++)
{
}
|
cs |