자주 사용하는 함수 전역화
C#의 Utils에다가 파일들 때려박아서 정의해놓은거랑 비슷하다.
삭제할 오브젝트들의 현재 프레임, 다음 프레임의 흐름파악
간단한 이벤트부터 처리를 해보도록 하자.
기본구조는 이번트 추가할 수 있는 함수 AddEvent 뚫어주고
update에서 하나하나씩 돌면서 처리를 해주어야한다.
이 '처리'를 해주는 함수를 하나 또 구현해야한다.
Excute 함수 만들어서 이벤트를 받아서 처리를 할 것이다.
이렇게 이벤트 타입을 스위치문으로 나눈다.
여기서 미사일 생성하자마자 현재 씬에 추가할 것이 아니라
이부분에서 이제 이벤트를 등록을 해야한다.
Func 헤더파일 만들자 -> Util에다가
Player에서 미사일 생성시 씬에다가 추가하는 작업대신에 CreateObject를 호출할 것인데
뭘 넣어주어야 할까?
=> 모든 오브젝트의 최상위 부모인 CObjeec 포인터를 받아준다.
두번쨰로는 어느 그룹의 오브젝트인지. 나누어 주어야한다.
현재 구조체의 멤버 변수의 타입이 DWORD이다.
주소값을 이렇게 형변환해서 받을 경우 문제 인것이
long == DWORD 이기 때문에 4바이트 이다.
현재 DWORD가 unsigned long이다.
현재 포인터의 크기는 x64이기때문에 8바이트 이다.
https://smallpants.tistory.com/10
여기 밑에 읽어보면
단 windows운영체제에서는 int와 long을 64비트에서도 4바이트로 사용한다.
32비트는 신경을 안 쓰고만들거기는 하지만
솔루션 플랫폼에따라서 전처리기로 typedef을 분기를 처리를 해놓은 자료형들이 있다.
이런게 있는데
이거인데
ULONG_PTR은 또 이거이다. __int64
근데 #define _WIN64 일경우에 이렇게 한다는 말이다.
64비트가 아닐 경우에는 그냥 long으로 받아들여진다.
griupType도 마찬가지로 DWORD_PTR로 형변환 해주도록 한다.
enum값은 어차피 '4바이트 정수'이다. (플렛폼에 상관없이)
지금
함수안에서 DWORD_PTR로 받았지만 안에들어있는 데이터의 정체를 알고 있는 것이다.
EventManager
update에서 이벤트들 처리할 것임.
이벤트 등록함수 구현
이벤트처리 함수 구현
Player->Scene에다가 바로넣지 않고 이벤트 등록 -> 이벤트 처리함수
이벤트 처리함수안에서 전달받은 이벤트 객체의 주소, 그룹의 타입에 따라 분류를 할것임.
이러한 이벤트의 정보는 Event 라는 구조체 안에 담겨있음.
이제 player가 미사일 만들거나하면은 이벤트 등록은 다 되었다.
이제 이벤트의 처리 시점이 중요한데...
현재이런 순서이다.
Core의 progress제일 마지막 단계에서 해주도록 하자.
그래야 rendering 도 안되고 다음 프레임부터 렌더링 될테니까.
이벤트 처리는 이렇게 여기서 하는 것이다.
다음 프레임부터 적용될 예정이다.
다른 이벤트들은 거의다 Create_OBJECT와 비슷하다
그런데 오브젝트 삭제하는게 좀 까다롭다.
updare -> render -> Event처리
이런순인데 update, render 부분에서 삭제해달라는 요청이 발생을 했으면은
그래서 이벤트 처리하는 부분에서 삭제 -> 그리고 그 다음프레임부터 적용.
이렇게 생각할 수 있지만, 삭제해야하는 오브젝트를 바로 삭제를 해버리면,
다음프레임에서 이 삭제된 오브젝트를 알고 있던 녀석들이 -> use after free!
현재 프레임에서는 트리거를 켜서 죽은애라고 알려줄 것이다.
그 다음 프레임에서는 다른애들이 "아~ 이녀석 삭제될 녀석이구나~" 하고 알 수 있다.
그다음에 이제 이번트 매니져에서
삭제될 예정인 애들을 삭제를 하는 것이다.
그래서 삭제예정이 될 애들 모다놔야함.
여기서 바로 삭제가 아니라 Dead 상태로 체크를 해주고 그다음 프레임에 이제 삭제를 해야한다.
현재 이부분이
위에 프레임에서 수행한 일이다.
update에서 먼저 위에서 해야한다.
이유는 당연히 eventManger시작할때는 (게임시작할 떄) _vecDead가 안 차있다.
그리고 나서 이번트 발생해서 이벤트 들이 쌓여야 어떤이벤트 든지 간에 쌓여있을 것이다.