포트폴리오/게임스쿨 졸작

12. 약간 개선된 카메라파트

codehunter 2010. 6. 15. 19:11

이번에 카메라 클래스를 원래 함께있던 게임씬에서 분리해내면서 예상치 못한 문제들이 발생했다. 기존에는 카메라 포인터를 여기저기서 가져다가 쓰면서도 하나의 테두리 안에 위치해 있어서 카메라변환시 큰 문제가 없었지만 카메라 클래스 자체를 분리를 하자 이 포인터를 게임씬에 어떻게 공급할지가 우선 큰 문제였다. 

그래서 해결방법으로는 카메라 클래스들만 관리하는 카메라 관리자 클래스를 하나 생성한뒤 아무 제약이 없는 자유카메라만 우선적으로 만든뒤에 게임씬 생성시 이 포인터를 넘겨주는것으로 일차 마무리는 되었다. 하지만 바로 또 문제가 발생하였는데 스카이 박스의 조종사 카메라 기준으로 처리시에 바뀐 카메라 포인터를 넘겨 주어야 하지만 서로 분리된 클래스에게 포인터를 넘겨줄 방법이 마땅히 떠오르지 않았다. 계속 소스를 살펴보던중 모든 클래스의 기반을 이벤트리시버 기반으로 만든것을 상기하게 되었다. 혹시 서로간에 통신할지도 모른다는 생각에 만들어 둔것인데 이런때 딱 맞는 상황이 된것이다. 그래서 바로 이벤트 메세지를 등록하고 카메라 클래스와 게임씬 클래스를 씬 매니저에서 연결시킨다음 카메라 변환시 이벤트를 넘겨주니 아주 잘 작동하였다. 원더풀!!

아래는 기존구조다.


아래는 약간 개선된 구조다. 기존의 MainCamera 라는 클래스가 하던일을 카메라 매니저로 빼면서 이벤트메세지를 게임씬과 주고받는 구조로 바뀌었다. 카메라 매니저는 업데이트할때마다 적당한 카메라로 변환후 이벤트 발생시 게임씬에 메세지를 전해주는 구조다.


아래는 카메라 변화시 이벤트 호출하는 코드이다.

void CCameraManager::CameraUpdate(float dTime /* = 0.0f */)
{
       ...
       // 카메라가 바뀌었을때 외부로 알려줄수 있는
       // 방법이 필요함
       ChangeNotify();
       ...
}

void CCameraManager::ChangeNotify()
{
          Event(MSG_CHANGECAMERA, (WPARAM)_pCurrCam);
}

아래는 게임씬에서 이벤트를 받는 부분이다.

VOID CChapter1::OnEvent(CEventReceiver* pObj, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
           switch (uMsg)
           {
                        case MSG_CHANGECAMERA:
                                  SetCurrCamera((CCamera*)wParam); // 스카이 박스에도 통보
                                 _pSkyBox->SetCurrCam(&_pCurrCam);
                         break;
            }
}

이런 구조가 가능한것은 첨부터 이벤트를 주고 받을수 있게 구성해놓은 때문이다.