Win32 API/기초

Win32 API 기초 : Scene (1)

시플마 2024. 8. 18. 00:30

시작 씬에서 Enter를 누르면

Tool 씬으로 전환하도록 할 겁니다.

 

그러기 위해선 CScene_Start 클래스에

update 함수를 오버라이딩하여 새롭게 구현해야 합니다.

 

자식 클래스의 update 함수에서도

부모 클래스인 CScene 클래스의 update 함수를

실행하고 거기에 if 문을 더 추가하여 

Enter를 입력할 시 ChangeScene 함수가

호출되는 방식이죠. 

 

Tool 씬을 인자로 넣습니다.

 

 

ChangeScene 함수 역시, 

 

전역 함수처럼 사용하기 위해

func 헤더 파일과 소스 파일에 구현하였습니다.

 

tEvent형 변수 even의 멤버 eEvent에는 

씬 변경 이벤트임을 나타내기 위해 CHANGE_SCENE를 대입,

멤버 lParam에는 어떤 씬으로 변경할지를 나타내기 위해

인자로 받은 씬의 값을 대입합니다.

 

그리고 AddEvent 함수를 통해 해당 even을

실행해야 할 이벤트를 저장하는 vector에 삽입합니다.

 

 

이 상태에서 다음 프레임에서 코어 매니저의

progress 함수를 통해 이벤트 매니저의

update 문이 호출되는 순간,

 

이벤트를 저장한 vector의 인덱스를 순회하면서

Excute 함수를 호출하게 됩니다.

 

 

그럼 인덱스에 들어있는 이벤트가

 

어떤 이벤트인지에 따라 다른

case 구문이 실행되는데요,

씬 변경 같은 경우 58번째 case 문에

걸리게 되겠죠.

 

씬 매니저에 있는 ChangeScene 함수에

인자로 받은 이벤트의 lParam 값, 즉 

어떤 씬으로 변경할지에 대한 씬의 값을 

인자로 넘겨 호출합니다.

 

 

씬 매니저의 ChangeScene 함수는

 

씬 변경 이벤트가 발생한 경우

오직 이벤트 매니저를 통해서만

호출하도록 할 것이기 때문에 

private으로 선언하였고 friend 키워드를 통해서

이벤트 매니저에서만 접근이 가능하도록 하였습니다.

 

 

씬 매니저의 ChangeScene 함수의

정의를 살펴보면,

 

다른 씬으로 변경하기에 앞서,

일단 현재 씬을 지워야 하기 때문에

현재 씬에 대한 Exit 함수를 호출합니다.

 

 

현재 씬은 시작 씬이므로

위에서 호출된 Exit 함수는

CScene_Start 클래스의 Exit 함수겠죠.

 

Exit 함수에서는 DeleteAll 함수를 호출하고 있습니다.

 

 

DeleteAll 함수는 CScene 클래스의 멤버 함수로,

 

씬이 갖고 있는 오브젝트를,

그룹 별로 돌면서 해당 그룹에 대한

DeleteGroup 함수를 호출하고 있습니다.

 

 

DeleteGroup 함수는 

 

해당 그룹에 속한 

오브젝트에 대하여 

Safe_Delete_Vec 함수를 호출하고 있네요.

 

 

타입이 명시되어 있는 것을 보니 

일반적인 함수가 아니라 함수 템플릿임을 알 수 있죠.

( 타입을 생략해도 컴파일러가 추론할 수 있는 경우라면

타입을 생략해도 잘 작동합니다. )

 

함수 템플릿이므로 함수가 바로 호출되는 방식이 아닌,

인자로 받은 타입을 토대로 함수 템플릿을 통해

함수가 하나 만들어진 후 그 만들어진 함수가 실행되는 방식이죠.

 

 

Safe_Delete_Vec 함수는

함수 템플릿이므로

 

func 헤더 파일에 구현되어 있습니다.

( 함수 템플릿은 분할 구현하면 오류가 발생해,

헤더 파일에 모두 구현해야 하죠. )

 

인자로 받은 vector를 참조함으로써, 복사가 되어

비용이 발생하는 것을 방지하였습니다.

 

 

인자로 받은 vector를 처음부터 끝까지

순회하면서 delete해 주고 있습니다.

 

그리고 clear 함수를 통해

해당 vector의 내부 값을 없애고 있네요.

 

 

 


 

 

 

다시 CSceneMgr 클래스의

ChangeScene 함수로 돌아와서,

 

현재 씬에 존재하는 모든 오브젝트들을 

Exit 함수를 통해 delete해 주었다면

현재 씬을 이제 변경할 다른 씬으로 

교체해 주면 되겠죠.

 

그러고 나서 바뀐 현재 씬에 대한

Enter 함수를 실행하면 씬 변경이 완료됩니다.

 

 

 

 


 

 

 

 

이 상태에서 프로그램을 실행하면

처음에는 Start 씬에 있는 오브젝트들이 

화면상에 보이다가 Enter를 입력하면 

Tool 씬으로 변경되면서 기존에 있던 

오브젝트들이 모두 사라지는 것을 확인할 수 있을 겁니다.

 

 

Tool 씬에서 다시 Start 씬으로 돌아오게 하고 싶다면

 

CScene_Tool 클래스에서도

update 함수를 오버라이딩하여,

현재 씬이 CScene_Tool인 상태에서

Enter를 입력할 시 ChangeScene 함수를 호출하여

인자로 Start 씬 타입을 넣으면

Start 씬으로 다시 변경이 되겠죠.

 


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