Win32 API 기초 : Camera (1)
게임 화면의 전체 해상도보다 실제
게임 맵이 더 클 수 있습니다.
그러면 보통 게임에서는 캐릭터 움직임에 따라
화면이 이동하면서 맵의 새로운 맵을 보여주죠.
이 역할을 해 줄 Camera를 구현하도록 하겠습니다.
CCamera라는 이름을 가진 클래스를 만듭니다.
헤더 파일부터 살펴보면,
멤버로 m_vLookAt가 있습니다.
현재 카메라가 보는 곳의 좌푯값입니다.
멤버 m_pTargetObject는
오브젝트를 가리키는 포인터로
만약 카메라가 특정 오브젝트를 따라다니도록
설정하고 싶다면 해당 멤버를 통해 오브젝트의
좌푯값을 얻어 활용하면 되겠죠.
m_vDiff는 초기 화면에서 카메라가 현재 얼마나
이동한 상태인지, 그 값을 저장하는 멤버입니다.
여기서 초기 화면은, 게임 해상도의 중앙이었죠.
카메라가 처음에는 게임 해상도로부터 중앙을
보고 있도록 설정할 것입니다.
17번째 줄에 있는 GetRenderPos 함수는
오브젝트의 위칫값으로부터
카메라가 중앙으로부터 얼마나 이동했는지의
값을 저장하는 m_vDiff의 값을 뺍니다.
그리고 GetRenderPos 함수가
반환한 위칫값을 통해
CObject의 render 함수에서
오브젝트를 화면상에 그려 줄 것입니다.
즉 오브젝트의 실제 위치와는 상관없이
카메라 위치에 따라 오브젝트를 그리는 위치를
다르게 하겠다는 것이죠.
GetRenderPos 함수에서
오브젝트의 위칫값으로부터
m_vDiff의 값을 빼는 이유는
위와 같이 오브젝트가 ( 10, 0 )에 위치하고 있다고 합시다.
위 상태에서 카메라가 x 축으로 10만큼
이동했다고 가정하면,
기존에는 오브젝트가 화면 중앙에 가까운 위치에
그려졌다면 카메라가 이동한 후에는 조금 더 왼쪽에
출력되야겠죠.
카메라는 x 축으로 10만큼 이동했는데
오브젝트는 오히려 x 축으로 -10만큼 이동한 곳에
출력돼야 하는 것입니다.
즉 카메라가 중앙으로부터 얼마만큼
이동했는지 계산하고 그 값만큼
반대되는 위치에 오브젝트가 그려져야 합니다.
CalDiff 함수는
m_vDiff의 값을 계산하는 함수입니다.
화면 전체 해상도를 CCore의
GetResolution 함수를 통해 구한 후,
x 축 해상도와 y 축 해상도를 각각 2로 나눕니다.
그러면 해상도의 중앙값을 구한 것이죠.
이를 지역 변수 vCenter에 저장합니다.
그리고 현재 카메라가 보고 있는 곳의
좌푯값에 해상도의 중앙값을 빼줍니다.
그러면 카메라가 중앙으로부터 얼마만큼
이동했는지 구할 수 있고 이를 멤버 m_vDiff에
저장합니다.
CalDiff 함수는 update 함수가 호출될 때마다
호출되어 멤버 m_vDiff의 값을 계산합니다.
update 함수에서는 현재 카메라가 계속 따라다니도록
설정되어 있는 오브젝트가 존재하는지 체크하고
존재한다면 해당 오브젝트가 제거될 예정인지
체크합니다.
제거될 예정이라면 카메라가 더 이상 해당
오브젝트를 따라다니지 않도록 m_pTargetObject에
nullptr을 대입합니다.
현재 카메라가 계속 따라다니도록
설정되어 있는 오브젝트가 존재하는지 체크한 후
해당 오브젝트가 죽을 예정이 아니라면
해당 오브젝트의 위칫값을 구해서
카메라의 위칫값에 대입합니다.
이러면 update 함수가 호출될 때마다
카메라의 위치가 갱신되면서 계속 오브젝트를
따라다니게 할 수 있죠.
강의 출처 : https://www.youtube.com/watch?v=uAaS-8sBvds&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=40