hyrule 2022. 5. 28. 22:25

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

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

hyrule.tistory.com

 


[사전 지식]

- STL에서는 기본적으로 정렬 알고리즘을 제공하고 있다.

- (자료구조).sort(bool 타입을 반환하는 함수 포인터)

-- 함수 포인터로는 전역 함수만을 받는다. 이 함수 포인터로 정렬 기준을 정한다.

--- static 멤버 메소드로 선언하면 전역 함수와 똑같이 취급되므로, 사용할 비교 메소드를 static으로 선언해주자.

 


- 지금 게임을 구동시켜보면, 무조건 몬스터가 플레이어 위에 렌더링되는 것을 확인할 수 있다.

- 씬이 생성될 떄 CGameObject를 생성한 순서대로 렌더링되고 있기 때문이다.

- 일반적인 2D게임은 화면의 밑에 있는 캐릭터가 화면의 위에 있는 캐릭터를 가리고 있다.

- 게임오브젝트의 Y축 값이 낮은 순을 기준으로 렌더링하는 것이다.

- 이것을 Y소팅이라고 한다.


class CScene

- 렌더링 메소드 안에서 각 CGameObject의 발 밑 Y축을 기준으로 소팅해준다.


- 근데 그냥 이렇게 해놓으면 문제가 발생한다.

- Y축이 가장 낮은 '배경화면'까지 정렬되어 배경화면이 가장 마지막에 그려지고, 결국 배경화면이 화면을 다 가려버리게 되는 것이다.

- 그러므로 '출력 그룹'을 나누어놓아 해당 그룹 안의 오브젝트 끼리만 정렬을 시켜줄 필요가 있다.

 


flag.h

< enum class ERender_Layer >

- 렌더링 그룹을 나누기 위한 열거체,

- 일단 기본적으로 Back, Default, Effect, Max 정도만 생성하자. Max는 배열 선언을 위한 원소이다.


class CGameObject

< m_ObjList >

- 이제 CGameObject가 그룹별로 나누어져야 하므로,

- 기존의 리스트를 ERender_Layer의 사이즈만큼 크기의 배열로 나눠 준다.

 

< ERender_Layer m_RenderLayer >

- 이제 게임오브젝트는 각자 자신이 어느 그룹에 속해야 하는지를 변수로 가지고 있는다.

- 생성자에서 기본값으로 Default 그룹에 설정해준다.

- 그리고 다른 그룹으로의 분류가 필요한 오브젝트들만 생성자에서 값을 따로 설정해 준다.

 

- 이제 m_ObjList는 배열이 되었으므로 게임오브젝트를 생성하는 CScene::CreateObject() 메소드도 ERender_Layer에 맞는 배열 인덱스로 넣어주어야 한다.

- 소멸자와, Update(), PostUpdate(), Render() 메소드 안의 반복문도 모두 수정해준다.

 


소팅이 잘 되는것을 확인
GameFrameworkStepbyStep_40_YSorting.zip
3.96MB