WinAPI 32 EventManager (2)

CJB_ny·2022년 9월 13일
0

WinAPI

목록 보기
31/79
post-thumbnail

오늘 배운거 👍👍👍

  • 자주 사용하는 함수 전역화

    C#의 Utils에다가 파일들 때려박아서 정의해놓은거랑 비슷하다.

  • 삭제할 오브젝트들의 현재 프레임, 다음 프레임의 흐름파악


간단한 이벤트부터 처리를 해보도록 하자.

기본구조는 이번트 추가할 수 있는 함수 AddEvent 뚫어주고

update에서 하나하나씩 돌면서 처리를 해주어야한다.

이 '처리'를 해주는 함수를 하나 또 구현해야한다.

Excute 함수 만들어서 이벤트를 받아서 처리를 할 것이다.

이렇게 이벤트 타입을 스위치문으로 나눈다.

등록하기

여기서 미사일 생성하자마자 현재 씬에 추가할 것이 아니라

이부분에서 이제 이벤트를 등록을 해야한다.

자주쓰는 함수 -> 전역화

Func 헤더파일 만들자 -> Util에다가

Player에서 미사일 생성시 씬에다가 추가하는 작업대신에 CreateObject를 호출할 것인데

뭘 넣어주어야 할까?

=> 모든 오브젝트의 최상위 부모인 CObjeec 포인터를 받아준다.

두번쨰로는 어느 그룹의 오브젝트인지. 나누어 주어야한다.

DWORD

현재 구조체의 멤버 변수의 타입이 DWORD이다.

주소값을 이렇게 형변환해서 받을 경우 문제 인것이

long == DWORD 이기 때문에 4바이트 이다.

현재 DWORD가 unsigned long이다.

현재 포인터의 크기는 x64이기때문에 8바이트 이다.

long 의 크기 ❗❗❗

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가 안 차있다.

그리고 나서 이번트 발생해서 이벤트 들이 쌓여야 어떤이벤트 든지 간에 쌓여있을 것이다.

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

0개의 댓글