CTileMap

Kimbab1004·2024년 10월 3일
0

CPP

목록 보기
27/27

새로운 컴포넌트인 CTileMap을 생성하였다. CTileMap은 행, 열 갯수와 Tile안에 채우고자 하는 아틀라스 텍스쳐의 타일 행, 열 갯수, 해상도등을 알고 있다.

그리고 Final Tick에서 생성할때 입력받은 행, 열값에 기반해서 초록색 Debug line을 그린다.

그리고 Render()에서 입력받은 행, 열과 미리 지정한 tile_size에 알맞게 가져오고자 하는 아틀라스에서 이미지를 때와 BitBlt해준다.

void CTileMap::Render()
{
	if (nullptr == m_Atlas)
		return;

	Vec2 OwnerRenderPos = GetOwner()->GetRenderPos();
	HDC dc = CEngine::GetInst()->GetSecondDC();

	// 카메라 영역 안에 들어오는 행, 열을 계산하기
	Vec2 vCamLook = CCamera::GetInst()->GetLookAt();
	int a = 0;
	//Resolution 메인 윈도우 해상도
	Vec2 vResolution = CEngine::GetInst()->GetResolution();
	Vec2 vCamLeftTop = vCamLook - (vResolution / 2.f);
	Vec2 vCamRightBot = vCamLook + (vResolution / 2.f);

	Vec2 vOwnerPos = GetOwner()->GetPos();
	vCamLeftTop = vCamLeftTop - vOwnerPos;

	int LeftTopCol = vCamLeftTop.x / TILE_SIZE;
	int LeftTopRow = vCamLeftTop.y / TILE_SIZE;

	if (LeftTopCol < 0)
		LeftTopCol = 0;
	if(LeftTopRow < 0)
		LeftTopRow = 0;

	vCamRightBot = vCamRightBot - vOwnerPos;
	int RightBotCol = (vCamRightBot.x / TILE_SIZE) + 1;
	int RightBotRow = (vCamRightBot.y / TILE_SIZE) + 1;

	if (m_Col < RightBotCol)
		RightBotCol = m_Col;
	if (m_Row < RightBotRow)
		RightBotRow = m_Row;

	for (int Row = LeftTopRow; Row < RightBotRow; ++Row)
	{
		for (int Col = LeftTopCol; Col < RightBotCol; ++Col)
		{
			// 반복문 회차에 맞는 행렬에 대해서 이게 몇번째 타일정보인지 1차원 인덱스로 변환
			// 해당 타일정보에 접근한다.
			int TileIdx = m_Col * Row + Col;
			int ImgIdx = m_vecTileInfo[TileIdx].ImgIdx;

			// 해당 타일의 ImgIdx 가 -1 인 경우, Blank Tile
			if (ImgIdx == -1)
				continue;

			int ImgRow = ImgIdx / m_AtlasTileCol; //  1 행
			int ImgCol = ImgIdx % m_AtlasTileCol; //   6 열

			assert(!(ImgIdx < 0 || m_AtlasTileCol * m_AtlasTileRow <= ImgIdx));

			//BOOL BitBlt(
			//	HDC hdcDest,    // 대상 DC (출력할 DC)
			//	int nXDest,     // 대상 DC에서 복사된 비트맵을 출력할 X 좌표
			//	int nYDest,     // 대상 DC에서 복사된 비트맵을 출력할 Y 좌표
			//	int nWidth,     // 복사할 비트맵의 너비
			//	int nHeight,    // 복사할 비트맵의 높이
			//	HDC hdcSrc,     // 원본 비트맵이 있는 DC
			//	int nXSrc,      // 원본 DC에서 복사할 영역의 X 좌표
			//	int nYSrc,      // 원본 DC에서 복사할 영역의 Y 좌표
			//	DWORD dwRop     // 복사할 때 사용할 비트 연산 (Raster Operation)
			//);

			BitBlt(dc
				 , (int)OwnerRenderPos.x + Col * TILE_SIZE
				 , (int)OwnerRenderPos.y + Row * TILE_SIZE
				 , TILE_SIZE, TILE_SIZE
				 , m_Atlas->GetDC()
				 , ImgCol * TILE_SIZE, ImgRow * TILE_SIZE
				 , SRCCOPY); 
		}
	}
}

그리고 새로운 obj를 하나 만들어준 다음에 자신이 원하는 행, 열, 아틀라스를 정해주고 Levelmgr을 통해 지금 레벨에 추가해주면 된다.

0개의 댓글