Win32 API/기초

Win32 API 기초 : Camera (1)

시플마 2024. 10. 4. 15:55

 

게임 화면의 전체 해상도보다 실제

게임 맵이 더 클 수 있습니다.

 

그러면 보통 게임에서는 캐릭터 움직임에 따라

화면이 이동하면서 맵의 새로운 맵을 보여주죠.

 

이 역할을 해 줄 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