본문 바로가기
Win32 API/기초

Win32 API 기초 : Collider (5)

글: 시플마 2024. 8. 5.

Collider끼리 복사가 발생할 수 있습니다.

 

Collider A의 값을 기반으로 Collider B를 

생성할 수도 있는 것이죠.

 

그러나 조심해야 할 점이 있는데,

기본 복사 생성자를 통해 복사를 진행하면

Collider마다 갖고 있는 고유한 값인 멤버 m_iID의

값도 복사시킬 것이고 각 Collider가 어떤 오브젝트에

달려있는지 나타내는 멤버 m_pOwner의 값도

그대로 복사하게 되는 문제가 생기죠.

 

그래서 아래 코드처럼

 

Collider의 복사 생성자를 직접 구현하여

기본 복사 생성자가 아닌 위에서 구현한 

생성자가 호출되도록 할 것입니다.

 

복사가 발생하더라도 멤버 m_pOwner의 값은

무조건 nullptr로 초기화, 멤버 m_iID의 값은

정적 변수인 g_iNextID에서 하나 올린 값으로

초기화하면 문제가 해결되겠죠.

 

또한 Collider의 위칫값과 offset을 통해

결정되는 m_vFinalPos의 값은

굳이 복사를 발생시킬 필요도, 초기화할 필요도 없겠죠.

 

 

 

그리고 Collider의 기본으로 오버로딩된 대입 연산자를

 

delete하겠습니다.

 

Collider끼리 대입 연산이 발생할

상황이 없기 때문에 미리 막아 두는 것이죠.

 

 

 


 

 

 

콜리전 매니저 클래스의 CollisionGroupUpdate 함수에서 

 

두 오브젝트에 대한 충돌을 판단하게 되죠.

 

43번째 줄에서 키-값이 ULONGLONG이고 

second 값이 bool형인 이진 탐색 트리, 즉 map 클래스의

iterator를 선언하였습니다.

 

 

그리고 충돌을 비교할 두 그룹 중 한 그룹의 오브젝트를

CCollider형 포인터 pLeft로 가리키고 나머지 한 그룹의

속한 오브젝트도 CCollider형 포인터 pRight로 가리킵니다.

 

 

62번째 줄에서 보이는 COLLIDER_ID 자료형은 

 

콜리전 매니저 클래스 상단에 선언하였습니다.

 

union으로,

COLLIDER_ID형 객체는 Left_id와

Right_id라는 멤버 변수를 보유하게 되고

두 개의 변수를 하나로 묶어 ID라는 이름으로

불러올 수 있습니다.

 

union으로 구성한 이유는 Left_id에 들어간

특정 그룹의 오브젝트의 ID와 Right_id에 들어간

특정 그룹의 오브젝트의 ID를 합쳐서

키-값으로 보고 두 오브젝트가 충돌하고 있으면

second 값을 true로 충돌하고 있지 않으면

second 값을 false로 설정할 예정이기 때문이죠.

 

 

또한 20번째 줄을 보시면,

두 개의 오브젝트가 이전 프레임에는

어떤 상태였는지 저장하는 map형 변수

m_PrevCollisionInfo을 선언한 모습입니다.

 

 

다시 돌아와서 63 ~ 64번째 줄을 보시면

 

두 Collider의 ID를 얻어서

COLLIDER_ID형 객체인 ID의 멤버 Left_id와

Right_id의 각각 대입하고 있습니다.

 

 

두 Collider의 ID를 합한 것을 저장한 ID의

멤버 ID를 키-값으로 하여 두 Collider가

이전에 충돌했었는지 그 기록을 find 함수를 통해 찾아

iterator인 iter에 저장합니다.

 

 

이때 iter에 저장된 값이 end iterator라면

 

두 오브젝트에 대한 충돌 검사가 이루어진 적이 없는 것이므로

m_PrevCollisionInfo에 insert 함수를 통해 새로 삽입합니다.

 

 

IsCollision 함수는 true 또는 false를 반환하는데

true를 반환한다면 인자로 넘긴 두 오브젝트가 충돌 

중이라는 의미이죠.

 

이 상태에서 iter의 second 값을 봤을 때,

true라면 현재 충돌 중이며 이전 프레임에서도

충돌하고 있었다는 의미입니다.

 

그럼 이전에도, 그리고 현재에도

충돌 중일 때 동작을 수행하는 OnCollision 함수를

호출합니다.

 

 

현재 충돌 중이지만 이전에는 충돌하고 있지 않았다면

OnCollisionEnter 함수를 호출하고 다음 프레임에서 

충돌했었음을 표시하기 위해 iter의 second 값에 

true를 대입합니다.

 

 

현재 충돌하고 있지는 않지만 이전에는 충돌했었다면

OnCollisionExit 함수를 호출하고 다음 프레임에서 

충돌하지 않았을 표시하기 위해 iter의 second 값에 

false를 대입합니다.

 

 

 


강의 출처 : https://www.youtube.com/watch?v=EdH96UORfTg&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=29


'Win32 API > 기초' 카테고리의 다른 글

Win32 API 기초 : Collider 활용 & Event Manager (1)  (0) 2024.08.11
Win32 API 기초 : Collider (6)  (0) 2024.08.10
Win32 API 기초 : Collider (4)  (0) 2024.08.04
Win32 API 기초 : Collider (3)  (0) 2024.07.28
Win32 API 기초 : Collider (2)  (0) 2024.07.27