새로운 컴포넌트인 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을 통해 지금 레벨에 추가해주면 된다.