WinAPI 31 Collider활용 & Event

CJB_ny·2022년 9월 12일
0

WinAPI

목록 보기
30/79
post-thumbnail

오늘 배운거 👍👍👍

  • 지연처리

  • dynamic_cast, 업캐스팅 할 때 문제 및 상황


현재 충돌 알림은 Collider가 받고있다.

그런데 결국 오브젝트가 이 충돌을 알아야하는데...

같은 충돌이 발생하더라도 충돌체에 따라서 할 일들이 다르다.

우리가 다형성을 이용하여 충돌체가 무엇인지 파악을 할 것이다.

최상위 부모인 Object에서 이렇게 함수를 만들어주고

Collider에서 충돌이 발생을 하면은 이렇게 Collider 컴포넌트를 전달해준다.

이부분을 '가상함수'로만들어 놓고 부모쪽에서 구현을 해놓을 것이다.

이것을 필요한 자식쪽에서 가상함수를 오버라이딩을 해놓으면 될 것이다.

호출스택 확인

잘 된다.

오브젝트 삭제

오브젝트를 이제 삭제하는 부분이 정말 쉽지가 않다.

(나도 꽤 고생했다...)

Collider에서 GetOwner라는 함수를 파놓고 이것을 Monster의 충돌에서 받는다.

이렇게 그런데 지금 받아온 것은 부모 COjbect타입이라 몬스터인지 플레이어인지..뭔지 분간이 안간다.

이럴때 방법이

  1. dynamic_cast

  2. 오브젝트마다 이름을 준다거나.


캐스팅

  • dynamic_cast : 다운 캐스팅

    부모 -> 자식 으로 캐스팅하는 부분인데 언제 되고 언제 안되고 숙지를 해라

  • 업 캐스팅

    https://blockdmask.tistory.com/241

https://docs.microsoft.com/ko-kr/cpp/cpp/dynamic-cast-operator?view=msvc-170


이름 부여

이렇게 이름을 멤버로 최상위 부모에 가지고

자식 오브젝트 마다 이름을 잘 지었다고 가정을 하자. 안 곂치게.

그래서

이런 조건이 걸렸다고 가정을 하자.

그러면 언제 어떻게 충돌한 물체를 삭제를 할 것인가???

삭제 ❓❓❓

충돌한 미사일을 삭제한다거나 할 경우 고려해야할 사항들이 많다.

씬안에있는 벡터에도 꺼내서 삭제를 해야하고,

또한 '어느시점'에 삭제가 올바르노?

유도탄을 쐇는데 포인터로 가르킨 곳을 가고있다가 중간에 갑자기 target이 삭제가 되었다.

ㅅㅂ? -> 이러면 안됨. 이상한 메모리에 접근을 하여 데이터를 가져올 수 있다.

또한 누군가가 삭제될 경우 그 삭제된 녀석을 참조를 하고있는 녀석들은 어떻게 해야하나?

(이거 shared_ptr. weak_ptr을 사용하면 되지 않을까...??)

삭제의 문제 ?

이렇게 Scene을 변경을 할때도 문제들이 많다.

a씬을 update돌리다가 render는 b씬을 돌린다거나

이런게 좀 '일관성'있게 통일 되어야한다.

이전에 KeyManager를 구현을 할때 중요했던게

'어떤 Event가 발생하게 되면은' => '해당 프레임'에 모두 동일하게 '적용'받아야한다.

같은 dt시간 안에서도 먼저 처리가 된애는 삭제된 녀석을 아~ 죽었구나 라고생각하고

먼저 처리가 안되고 같은 dt시간동안 나중에 처리가 된 애는 살아 있다라고 인식을 하게 된다.

지연천리 ❗❗❗

그래서 이런 삭제되거나 이런 이벤트 들은 한데 모아서 '지연처리'를 할 것이다.

모든 프레임이 충분히 update 된 다음에 '지연처리'를 통해서 다음번 프레임에 모두에게 적용을 시킬 것이다.

그래서 어떤 사건이 발생한다면은 해당 프레임에 바로 발생하는게 아니라,

해당프레임에서는 어떻게보면은 '예고'를 하는 것이고, 이런 사건들을 모아서 일괄 처리 한다음에

다음 프레임에 이것을 적용 시킨다는 것이다.

이렇게 할 수 밖에 없다.

EventManager를 만들어서 이녀석은 이런 이벤트들을 모아서 '취합'을 할 것이고

프레임이 끝나고 다음 프레임이 올 경우 eventManager가 다음 프레임에 모아두었던 것을 다 처리를 할 것이다.

미사일 생성의 문제점 ❗❗❗

지금 우리가 update를 돌다가 스페이스바를 누르면 다짜고자 현재씬을 찾아와서

새로 생성된 미사일을 셔넣는다.

해당 프레임 내에서 플레이어가 먼저 update를 받는다는 보장이 없다.

'순서에 상관없이 동시간에 일어나는 일'이다.

현재 플레이어가 스페이스바를 눌러서 미사일을 쏘는 상황은

플레이어가 미사일을 생성시키겠다고 하자마자 이 생성된 미사일이 씬에 추가가 되고있다.

그래서 중간에 동그라미 가 update되기 전까지는 미사일은 존재하지 않았다라는 것이다.


위에 말이 조금 이해하기 어려운데 최대한 정리를 하자면은

같은 dt시간이라고 하더라도 어쨋든 컴퓨터는 순차적으로 일을 처리를 한다.

그런데 같은 dt시간동안에 하필이면 dt의 딱 중간쯤에 내가 스페이스바를 눌러서

dt의 마지막 시간 쯔음에 미사일이 생성되었다고 가정을 하자.

dt중간 시간 이전에는 미사일의 존재를 모르고

스페이스바를 누른 시점 이후 부터는 미사일의 존재를 알게된다.

이말이다.


그래서 위에서 잠깐 정리한 것처럼 이게 어떻게 같은시간 안에서 일어난 일이라고 볼 수 있느냐 이말이다.

그래서 이런 부분들도 다 사실은 이벤트 처리를 했어야하는 부분이다.

Event종류

씬이 update되는 도중에 이런 이벤트들이 eventManager에 모일 것이다.

그래서 물체들은 저런것을 하고 싶다면은 eventManager이런 것들을 넣어 주어야한다.

충돌의 경우

이렇게 OnCollisionEnter를 하였는데 충돌한 물체가 갑자기 삭제가 되어버린다면 어떻게되나?

아직 Exit를 호출하지못하였는데 말이다.

그래서 충돌중이다가 갑자기 삭제된것도 충돌을 벗어났다라고 봐야한다.

이런것들도 처리를 해아한다.

좀 많이 복잡하고 어려우니까 집중해야한다.

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

0개의 댓글