#1. Engine System
+ WinMain - EngineSystem
+ EngineCore
+ EngineError
+ MainNode
#2. FrameWork
+ Grahpics
+ Image - SpriteData
+ Layer (현재 글)
+ Input
+ Game
+ Manager
+ Game Interface
+ Utility
#3. Testing Module
+ 2D Image Test
+ 2D Animation Test
+ Game UI Test
-----------------------------------------------------------------------
LayerManager Class .cpp 내용을 살펴보도록 하겠습니다.
1. 간단히 생성자와 소멸자 그리고 initialize 함수를 보도록 하겠습니다.
생성자 부분에서는 현재 LayerState 값이 LAYER_NONE 값으로 초기화 됩니다.
소멸자는 release 함수 호출뿐이군요.
initialize 함수에서는 미리 네임스페이스로 만들어두었던 기본 LAYER들 값들에 맞춰서
addLayer 함수를 호출하여 레이어를 등록하도록 되어있습니다.
반복문으로 처리하면 안되~? 라는 생각도 해봤습니다만
= _=아마 당시에 만들면서 귀찮아 그냥 몇개 안되니까 하드코딩으로 만들자
라고 생각했던 것 같네요.
enum Class 타입의 값을 반복문으로 알아서 처리되게끔 고치실 수 있다면 initialize 코드를 개선해보시는것도 좋을 것 같습니다.
release 함수에서는 각각 Layer들이 new 로 할당되어 등록되었기 때문에
해지해주는 과정이 이루어지고 있습니다.
(SAFE_DELETE 매크로를 이용하여 해지합니다. SAFE_DELETE 매크로는 graphics 글에서 언급했습니다.)
initialize 함수의 addLayer 과정을 통해 다음 그림과 같이 Layer가 layerVec에 쌓이게 됩니다.
레이어 순서는 번호 순서대로 위에서 아래로 렌더링 순서가 정해집니다.
enum class 형태의 값 순서대로 읽어 가기 때문인데요.
여기서 중요한 점은 AddLayer 함수를 호출하면 레이어가 enum Class 값 형식에 맞춰서 정렬됩니다.
만약 같은 Layer 타입이라면 딱히 같은 타입들사이에서는 정렬 될 필요가 없다 느꼈기 때문에
다른 타입들간의 순서만 정렬시켜줍니다.
그럼 이제 AddLayer 함수를 살펴보겠습니다.
2. addLayer
addPlayer 함수는 initialize() 에서 Layer를 등록하면서 호출 되었덩 함수입니다.
코드를 먼저 보겠습니다.
// 레이어 등록이 성공적으로 끝났다면 true값으로 바뀝니다.
Line 3 : bool success = false;
// 만약 레이어 타입이 네임스페이스LayerManagerNS::none 과 같다면 false를 리턴합니다.
Line 6 : if (layerkey.compare (LayerManagerNS::none) == 0)
Line 10 ~ 15 : 현재 레이어 리스트에 등록된 같은 레이어가 있는지 확인하여 있다면 false를 리턴합니다.
Line 17 : 여기까지 왔는데 아무이상없었으면 Layer를 등록합니다.
Line 18 : success 값을 true 로 변경합니다.
Line 20 : 레이어 정렬 함수를 호출합니다.
아마 위에 적어둔 설명을 보시면 아마 AddLayer 함수 내용자체는 별로 어려운 것이 없을 것 입니다.
★주의 할 점은 현재 layerList 라고 하는 MAP 형태의 컨테이너에만
Layer를 담았다는 것을 꼭 확인하시기 바랍니다.
3. deleteLayer
DeleteLayer() 함수는 AddLayer 함수와 반대로 등록 된 레이어를 삭제하는 함수입니다.
간단히 layerList 에 등록 된 레이어 중에 파라미터로 받은 레이어 이름과 비교하여
등로 된 레이어가 있다면 layerList에서 해당 항목의 레이어를 erase 시킨 후
sortLayer() 함수를 호출하여 줍니다.
4. sortLayer
네 번째로, addLayer과 deleteLayer에서 호출한 sortLayer 함수를 살펴보겠습니다.
sortLayer는 함수명 그대로 레이어들을 정렬시키는 함수입니다.
위에서 주의할 점으로 layerList 라고 하는 Map 타입의 컨테이너에 Layer를 담았었다는 것을 보셨을 겁니다.
그 이유는 바로 layerList (Map 컨테이너)에서 정렬을 수행 한 후
진짜 컨테이너인 layerVec (Vector 타입의 컨테이너) 에 정렬 시킨 후 담아두기 위함입니다.
sortLayer( ) 함수 자체는 간단하게 3줄로 되어있습니다.
1. std::vector<std::pair<std::string, Layer*>> 형태의 벡터 컨테이너를 먼저 만듭니다.
그리고 생성과 동시에 layerList에 담겨있는 Layer들을 그대로 begin 부터 end까지 넣어줍니다.
2. 미리 헤더에 생성해둔 Sort 템플릿을 이용하여 정렬시킵니다.
3. layerVec 의 값을 위에서 정렬 시킨 컨테이너로 넣어줍니다.
그리고 SortLayer에서 중요한 점은 아래의 템플릿을 이해를 하셔야 합니다.
방법은 간단히 좌우 값을 비교하여 작은 값 순서대로 정렬을 시킵니다.
아마 정렬하는 로직은 간단해서 이해하시기 어려움이 없을 것이오나, 템플릿을 사용하는 점에대해서는 스스로 템플릿이 뭔지 알고보셔야 아마 이해하시는데 문제가 없을거라 보입니다.
'MyProject > SephyEngine' 카테고리의 다른 글
June_Engine #2_Input .h (0) | 2017.05.18 |
---|---|
June_Engine #3_LayerManager Class .h (0) | 2017.04.21 |
June_Engine #3_Layer Class (0) | 2017.04.21 |
June_Engine #3_Image Class .cpp (2) (0) | 2017.04.20 |
June_Engine #3_Image Class .cpp (1) (0) | 2017.04.19 |