CEngine.cpp에서 싱글톤 패턴 생성후 Progress()
CLevelMgr의 Progress에선 m_CurLevel의 Tick과 FinalTick 실행한다. 여기서 m_CurLevel이 무엇이냐?
m_CurLevel은 cLevel Class의 주소를 가지고 있는 포인터이다.
그래서 처음 CLevelMgr을 Init할때는 m_CurLevel의 LEVEL_TYPE을 START로 정한 것을 볼 수 있다.
Tick에서 이전 프레임에 등록된 충돌체들의 등록을 해제하는 이유는 이전 상태를 초기화 함으로서 좀 더 정확한 충돌 검사를 진행하기 위해서이다.
그리고 m_vecObjects의 각 레이어에 등록된 CObj들에 대해 Tick을 해준다.
m_vecObjects는 CLevel Class가 가지고 있는 CObj의 주소를 받는 vector로 크기는 LAYER_TYPE::END 만큼이다.
m_vecObjects에는 위에서 설명했던 대로 CObj의 주소값들이 들이가 있다.
CLevelMgr 소스파일의 Init에서 처음 start Level에 Monster와 Player를 AddObject하는데 이 AddObject할때 CObj를 상속받은 CMonster의 주소를 가지고있는 pMonster 포인터를 LayerType::Monster로 설정해 CLevel의 주소를 받고있는 pLelvel의 m_vecObjects[LAYER_TYPE::MONSTER]에 넣고 있는 것이다.
아래는 최상위 부모 클래스인 CObj로 m_vecObjects[i][j]->Tick();에서의 Tick은 CObj의 포인터 주소의 Tick을 실행하는 것이기 때문에 여기서의 Tick을 실행하는 것이다.
m_vecObjects[i][j]->Tick()을 F12로 추적해보면 Object 객체들의 Tick만을 찾을 수 있는걸 확인 할 수 있다.
CPlayer는 다른 Obj와는 다르게 특정 상황에서 새로운 OBj를 생성하는 Obj이기 때문에 다뤄보도록 하겠다. CPlayer는 Space를 누를 경우 CMissile Type의 pMissile 포인터를 생성하는데 이는 CGuidedMissile Class 객체이다.
그리고 AddObject를 하지않고 CreateObject를 이용한다.
CLevelMgr를 살펴 보면 원하는 Obj를 만든 후 AddObject로 mCurLevel의 m_vectObject에 현재 Obj의 포인터와 LayerType을 넣는 모습을 볼 수 있는데 왜 CreateObject를 하는 것일까?
현재는 프로젝트의 볼륨이 크지 않기 때문에 특정 이벤트가 발생했을때 그때그때 처리해준다면 문제가 없지만 만약 볼륨이 커지고 여러 이벤트가 동시다발적으로 발생했을때 문제가 터질경우 어느 부분에서 문제가 터졌는지 확인할 방법이 없다. 그리고 각 이벤트 간의 의존성이 높을 경우 유지보수와 테스트에 큰 어려움을 겪는다 그렇기 때문에 바로 실행하지 않고 추가적으로 TaskMgr를 통해 각 이벤트를 일관적으로 실행함 으로서 작업 처리의 일관성과 유연성을 유지한다.
CTaskMgr은 싱글톤 패턴으로 처음 CEngine 소스파일에서 시간, 레벨 ,충돌 검사에 대한 작업이 끝난 후 마지막에 실행된다. 그 이유는 추가적으로 발생한 Task들을 적용하기 위해서이다.
CTask는 자신이 가지고 있는 여러 Task에 대한 작업을 진행한다. tTask Type은
CreateObject하면 현재 추가할 오브젝트와 설정한 TaskType을 인자로 받고 이걸 tTask Type의 task 객체로 선언하고 CTaskMgr에 AddTask한다.
AddTask하게 되면 CreateObject는 CREATE_OBJECT TASK, GuildMissile, LAYER_TYPE::PLAYER_OBJECT 데이터를 가지고 있다.
위에서 설명한 것 처럼 CEngine 소스파일에서 마지막에 CTask의 Tick()을 실행할때
m_Task vector의 사이즈만큼 반복문을 돌려 안에 있는 Task들을 수행한다.
우리는 CREATE_OBJECT TASK, GuildMissile, LAYER_TYPE::PLAYER_OBJECT 데이터를 가지고있는 Task가 있기 때문에 아래와 같은 과정을 거쳐 CLevel에 AddObject 된다.