소팅

김주현·2021년 8월 6일
0

Win API

목록 보기
13/14

이번엔 소팅을 통해 2차원게임에서의 깊이를 구현해보겠습니다.

소팅

3차원게임에서는 X,Y축과 Z값이 있기때문에 3차원을 표현할수있습니다 하지만 2차원 게임에서는 x,y에서는 그저 평면상에 그림을 그리는것이기 때문에 그려주는 순서로 깊이를 구현해야합니다.

먼저 그려지는쪽은 나중에 그려지는쪽에 의해 가려지게되고 이는 플레이어가 보기에 나중에 그려진쪽이 앞에있다고 생각하게 되기때문입니다 그리고 2차원게임에서 이 나중에 그려지는 기준은 바닥점 즉 오브젝트의 최하단이 밑에있는쪽을 나중에그리면됩니다.

그렇다면 게임오브젝트 매니저와 렌더부분을 수정해보겠습니다.

게임 오브젝트 매니저

우선 Enum.h에 소팅하기위한 열거체를 우선적으로 선언해줍니다.

#pragma once
namespace OBJECT
{
	enum ID { PLAYER, MONSTER, BULLET, SHILED, MOUSE, BUTTON,END };
	enum RENDER_LIST { BACKGROUND, GAMEOBJECT, UI, RENDER_END };
}

여기선 배경과 게임오브젝트 UI로 나누었습니다 우선적으로 배경이 제일 먼저 그려져야할것이고 그다음 오브젝트 들이 마지막으로 UI가 그려져야할것이기 때문입니다.

다음 오브젝트 매니저에 기존 리스트에 하나더 추가를 해줍니다

private:
	list<CGameObject*> m_listGameObject[OBJECT::ID::END];
	list<CGameObject*> m_listRenderObject[OBJECT::RENDER_END]; 

위 리스트는 기존 오브젝트들을 담은 리스트들이고 렌더 오브젝트 리스트는 게임오브젝트에서 주소를 받아와 그려줘야하는 순서대로 정렬후 그려줄 리스트입니다.
새로 생성한 리스트에 넣어주기위해서는 각각 타입을 가지고있어야하므로 게임오브젝트에 멤버 변수와 겟함수를 추가해줍니다.

	OBJECT::RENDER_LIST Get_RenderGroup() { return m_eRenderGroup; }

	OBJECT::RENDER_LIST m_eRenderGroup;

이로써 준비는 끝났으니 한 프레임만다 리스트에 오브젝트를 넣어주고 정렬후 출력해주면됩니다.

오브젝트매니저 업데이트와 렌더 수정

void CGameObject_Manager::Update_GameObject_Manager()
{
	for (int i = 0; i < OBJECT::END; ++i)
	{
		for (auto& iter = m_listGameObject[i].begin(); iter != m_listGameObject[i].end(); )
		{
			int iEvent = (*iter)->Update_GameObject();

			if (OBJ_DEAD == iEvent)
			{
				Safe_Delete(*iter);
				iter = m_listGameObject[i].erase(iter);
			}
			else
				++iter;
		}

		for (auto& pObject : m_listGameObject[i])
		{
			pObject->Late_Update_GameObject();
			if (m_listGameObject[i].empty())
				break;

			OBJECT::RENDER_LIST eRenderList = pObject->Get_RenderGroup();
			m_listRenderObject[eRenderList].emplace_back(pObject);
            		//겟 렌더 그룹을 통해 그룹을 구해오고 그에맞는 인덱스에 오브젝트를 넣어줍니다.
		}

	}

	CCollision_Manager::Collision_RectEX(m_listGameObject[OBJECT::MONSTER], m_listGameObject[OBJECT::MOUSE]);
}

void CGameObject_Manager::Render_GameObject_Manager(HDC hDC)
{
//이제 기존 리스트에서 앞에있는 순서대로 그리는것이아닌 렌더리스트의 순서대로 그립니다
//그리기 전 우선 정렬(Y값이 큰것이 나중에 그려지도록 = Y값 오름차 순)
	for (int i = 0 ; i < OBJECT::RENDER_END ; ++i)
	{
		// 조건자. 
        //리스트의 sort멤버하수와 람다식을 이용해 정렬해줍니다
		m_listRenderObject[i].sort([](auto& pDst, auto& pSrc) 
		{
			return pDst->Get_Info()->fY < pSrc->Get_Info()->fY; 
            		//y값을 구해와 오름차순으로 정렬해줍니다
		});
	}
	for (int i = 0; i < OBJECT::RENDER_END; ++i)
	{
    		//이제 정렬된순으로 그려준뒤 렌더해주면 됩니다.
		for (auto& pObject : m_listRenderObject[i])
			pObject->Render_GameObject(hDC);
			
		m_listRenderObject[i].clear(); 
	}
}

플레이어가 몬스터보다 아래에있을때는 몬스터가 먼저 그려지는것을 볼수있습니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN