hyrule 2022. 5. 29. 00:06

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처

hyrule.tistory.com

 


- 창의 크기가 만약 1280x720 사이즈라면, 우리가 창에서 쓸 수 있는 좌표값은 (0, 0)부터 최대 (1280, 720) 까지이다.

이 이상 또는 이하의 값으로 그려내면 화면 밖으로 나가버린다.

 

- 우리는 그래서 큰 판을 만들어놓고, 이 판을 움직이면서 '그려질 지점'을 계속 바꿔주어서 카메라를 사용할 수가 있다.

출처: https://www.vingle.net/posts/109460

- 이런 고정된 확대기를 놓은 뒤, 아래에 놓인 판을 움직이면서 넓은 구역을 출력할 수 있게 된다고 보면 된다.

- 그러므로, 넓은 맵의 어디를 보던 간에, 그 지점의 왼쪽 위 좌표는 (0, 0)이 되어야 한다는 말이 된다.

 

- 카메라는,그려져야 할 곳의 위치의 좌측 상단 좌표값을 저장한다고 보면 된다.

 

- 예를들어 아래 사진의 파란색 구역을 창에 출력하려고 한다고 가정하자. 

 

- 이 상황에서 저 파란 구역을 그리는 방법은, (200, 1000)을 창의 (0, 0)부분까지 끌어오는 것이다.

- 어떻게 해야할까?

-> 매우 간단하다. 그냥 Render() 단계에서  출력하고자 하는 구역 안에 있는 CGameObject들의 좌표값에서 카메라의 좌표값(m_Pos)만큼을 빼주면 된다.

--> 아래의 그림을 보면 이해가 빠를것이다.

 

-> 이런 식으로 윈도우 창 안으로 화면 밖의 게임오브젝트를 끌어와서 출력하게 되는 구조이다.

 

- 여기서 더 응용해서 화면 바깥에 있는 물체들은 아예 Render() 과정을 스킵해버리는 것도 가능하다(최적화)

 


class CCamera

- Scene 폴더에 생성.

- Scene 필터 하위에 Camera 필터를 새로 만들어 정리

 

< Vector2 m_Pos >

- 카메라의 위치

 

< Vector2 m_Resolution >

- 창의 해상도

 

< Vector2 m_WorldResolution >

- 전체 월드 사이즈

 

< Vector2 m_TargetOffset >

- 오프셋만큼 카메라가 치우침

 

< Vector2 m_TargetPivot >

- 타겟이 있을경우 타겟을 어느 부분에 출력할것인지 확인

- 정가운데 놓고 출력할것인지 조금 쏠리게 출력할것인지

 

* 해당 메소드들의 값을 설정하는 메소드를 생성해 준다

- 벡터값 1개 또는 float값 2개를 받는 메소드로 오버로딩

 

* 해당 메소드들의 값을 받아오는 메소드도 만들어 준다.

 

 

< CSharecPtr > m_Target >

 

 

< void Update() >

- 가장 먼저 타겟이 있는지 없는지부터 확인

-- 타겟이 있다면 타겟이 혹시나 죽지는 않았는지 확인 

--- 아니라면 카메라의 m_Pos를 구한다.

---- 카메라의 위치는 타겟이 있을 경우 타겟을 중심점으로 해서 Pivot 비율과 Offset만큼 치우치게 위치하면 된다. 

----> 사실상 CGameObject의 렌더링과 비슷하다고 보면 된다.

 

 

- 추가로 카메라가 월드 해상도 이상 벗어나지 못하도록 처리해준다.

 


class CScene

- 씬은 CCamera 클래스를 무조건 하나 들고 있는다.

- 생성자에서 동적할당, 소멸자에서 제거한다.

- 이제 CScene::Update() 메소드 안에 CCamera::Update() 로직을 포함시켜서 카메라 위치에 대한 지속적 업데이트를 해주자.

 


class CGameObject

- 앞으로는 Render() 과정에서 출력 좌표값에서 CCamera의 m_Pos를 빼 주어야 한다.(이유는 위에)

- 추가로, 만약 계산된 좌표값이 화면 안에 있을때만 출력 로직으로 들어가게 설계하여 최적화를 해주자.


class CMainScene

- 이제 실제 씬의 초기화 단계에서 화면 해상도, 월드 해상도, 피벗 등의 기본값을 설정해준다.


정상적으로 작동하는 것을 확인

* 총알도 카메라 기준으로 위치를 잡아주어야 저렇게 혼자 다니지 않는다.

 

GameFrameworkStepbyStep_41_Camera.zip
4.07MB