*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
- 창의 크기가 만약 1280x720 사이즈라면, 우리가 창에서 쓸 수 있는 좌표값은 (0, 0)부터 최대 (1280, 720) 까지이다.
이 이상 또는 이하의 값으로 그려내면 화면 밖으로 나가버린다.
- 우리는 그래서 큰 판을 만들어놓고, 이 판을 움직이면서 '그려질 지점'을 계속 바꿔주어서 카메라를 사용할 수가 있다.
- 이런 고정된 확대기를 놓은 뒤, 아래에 놓인 판을 움직이면서 넓은 구역을 출력할 수 있게 된다고 보면 된다.
- 그러므로, 넓은 맵의 어디를 보던 간에, 그 지점의 왼쪽 위 좌표는 (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
- 이제 실제 씬의 초기화 단계에서 화면 해상도, 월드 해상도, 피벗 등의 기본값을 설정해준다.
정상적으로 작동하는 것을 확인
* 총알도 카메라 기준으로 위치를 잡아주어야 저렇게 혼자 다니지 않는다.
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
43. 충돌 처리 2 - 충돌체 1 (0) | 2022.05.30 |
---|---|
42. 충돌 처리 1 (0) | 2022.05.29 |
40. Y Sort Rendering (0) | 2022.05.28 |
39. 배경화면 생성 및 플레이어 이동 (0) | 2022.05.28 |
38-1. 애니메이션을 등록하는 다양한 방법들 (0) | 2022.05.28 |