WinAPI 29 Collider (5)

CJB_ny·2022년 9월 10일
0

WinAPI

목록 보기
28/79
post-thumbnail

오늘 배운거 👍👍👍

  • union ❗❗❗

    union 잘 쓰지는 않지만
    union을 통해 비트열을 다르게 해석해서 ID를 부여했던것은 엄청 신선했다...
    나도 다음에 써먹자..

  • union 을 통한 절대적 ID부여 방법


Collider 생성자를 호출 할 때마다 id를 하나씩 증가시켜서 받고있는데


나는 일단 실행하면 이런식으로 뜨네??


나중에 Collider가 복사가 된다고 하면은 어떻게 될까??

복사 생성자가 호출되어서 모든 멤버들의 값을 싹다 복사 해준다.

(기본 복사 생성자의 경우)

각각의 객체들을 id가 달라야하기 때문에

그래서 '얕은 복사'방식이 아니라 '깊은 복사'를 해주어야한다.

지금 우리가 id값을 다 다르게 하고싶은 기획?적인 부분이 있기 때문에

명시적 복사생성자에서 복사할것들만 이렇게 챙겨 주기로하자.

_finalPos는 매프레임 계산될 것이기 때문에 안챙겨주어도 상관없다. (나중에 Vector2 기본생성자 호출 될 것이다)

operator =

우리가 게임 중간에 충돌체 끼리 대입을 한다?

대입을 할 상황이 없는거같다. 이부분은

이렇게 막아주도록 하자.

(id 복사를 방지 하기 위해서)

union ❗❗❗

애내들 LARGE_NTEGER 이거 __int64 == long long 8바이트 정수로 기억하라고 했었는데

사실은 까서 들어가보면은 union타입을 구조체처럼 재정의 해놓은 것이다.

LARGE_INTEGER안에 QuadPart가 있는 것이다.

union 특징 ❓

구조체와 유사하다.

구조체의 사이즈 ❗❗

sizeof(Test) => ??

8바이트 이다.

struct Test
{
	char a;
    int b;
    double c;
};

sizeof(Test); => ??

16바이트 이다. 생각 ㄱㄱ.


https://blog.naver.com/sharonichoya/220495444611


union의 사이즈

이렇게 했을 경우 사이즈가 4바이트가 나온다.

제일 큰 사이즈 기준으로 같은 공간을 공유하도록 되어있다.

Test의 객체를 t라는 이름으로 만들어서 t.a했을 때는 Test라는 union을 정수로 해석을 하는것이고

t.f로 보면은 float로 해석을 하겠다라는 말이다.

LARGE_INTEGER 분석

이부분을 union문법으로 다시 분석을 해보자면은

이런느낌이다.

중간에 메크로로 DUMMY 이부분 아무런 이름 정해 져 있지 않은 녀석이라

이거랑 같은 말이다.

그래서 이렇게 QuadPart로하고 지칭 하면은 8바이트 정수로 보겠다라는 의미 이고

.u라고 지칭을 하면은 전체를 하나의 구조체 타입으로 보겠다라는 의미이다.

.u라고 지칭을 할 경우에는

이렇게 low, High나누어서 또 지칭이 가능하다 (구조체라서)

그게아니라면 또 Low, High파트 로 지칭할 수도 있고. (아까 DUMMY부분 때문에)

충돌체간에 이전 프레임정보를 가지고 있기 위해서 map을 사용하기로했었다.

이렇게 longlong을 키값으로 할 것이다.

이렇게 유니온 정의하면 크기는 8바이트 이고 그 안에서 구조체 또는 ID로 나뉘는 것이다.

이렇게하면 id를 하나 만들어 낼 수 있지 않을까?

(Collider에 GetID구현하고)

id.ID 는 8바이트 정수인데 이녀석은 어떻게 되나?

id.ID로 가르키면 고유한 값이 있다.

왜??

이것을 map의 key값으로 사용을 하겠다라는 것이다.

이렇게 해줄 수 있을 것이다.

그런데 end라는 말이 무슨 말이냐? 이전 프레임에 충돌한 적이 없다는 것이다.

이렇게 union을 사용하여 고유한 비트자릿수를 만들어서 make_pair로 등록을 한다.

그리고나서 이제

현 시점 기준으로 두 물체가 충돌을 하냐 안하냐를 따질 것이다.

현재 iter가 '이전 프레임 정보'이다.

이제 이전프레임의 정보를 가지고 Enter, Stay, Exit를 구분할 수 있다.

이런함수 만들어주고 실제로 충돌했을 때

충돌한 상대방의 Collider를 넣어 줄 것이다.

충돌 Stay, Enter, Exit

이런식으로 분기문을 작성해주고 iter의 second값을 상황에 맞게 true, false로 해주도록 한다.

이제 해야할 일은

충돌만 제대로 검사할 수 있으면 끝난다.

충돌을 검사하는 부분을 구현을 하면 끝이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글