타일과 미니맵
수업에서 중요하다 생각하는 부분을 정리하며 복습하기위해 작성한 글입니다.
타일
typedef struct tagTile
{
D3DXVECTOR3 vPos;
D3DXVECTOR3 vSize;
int iDrawID;
int iOption;
}TILE;
타일 구조체입니다 타일의 위치와 사이즈 드로우ID와 옵션을 멤버변수로 가지고있습니다 관리는 Terrain클래스에 타일 포인터를 가지는 벡터를 생성해 관리합니다.
HRESULT CTerrain::Ready_Terrain()
{
m_vecTile.reserve(TILEX * TILEY);
TILE* pTile = nullptr;
float fX = 0.f, fY = 0.f;
for (int i = 0 ; i < TILEY; ++i)
{
for (int j = 0 ; j < TILEX ; ++j)
{
pTile = new TILE;
fX = (j * TILECX) + ((i % 2) * (TILECX >> 1));
//홀수줄이라면 그대로 짝수줄이라면 가로폭의 절반만큼 더이동
fY = i * (TILECY >> 1);
//세로폭만큼 이동이아닌 절반만큼이동 줄을맞춰 타일을 설치
pTile->vPos = {fX, fY, 0.f};
pTile->vSize = { 1.f, 1.f, 0.f };
pTile->iDrawID = 11;
pTile->iOption = 0;
m_vecTile.emplace_back(pTile);
}
}
return S_OK;
}
사각형이 아닌 마름모의 타일을 사용하기때문에 기존과는 달리 홀수줄과 짝수줄을 나누어 규칙에따라 타일을 배치합니다.
void CTerrain::Render_Terrain()
{
int iSize = m_vecTile.size();
TCHAR szBuf[MAX_PATH] = {};
for (int i = 0 ; i < iSize ; ++i)
{
const TEXINFO* pTexInfo = CTexture_Manager::Get_Instance()->Get_TexInfo_Manager(L"Terrain", L"Tile", m_vecTile[i]->iDrawID);
if (!pTexInfo)
return;
D3DXMATRIX matScale, matTrans, matWorld;
D3DXMatrixScaling(&matScale, m_vecTile[i]->vSize.x, m_vecTile[i]->vSize.y, 0.f);
D3DXMatrixTranslation(&matTrans, m_vecTile[i]->vPos.x - m_pView->GetScrollPos(SB_HORZ), m_vecTile[i]->vPos.y - m_pView->GetScrollPos(SB_VERT), 0.f);
matWorld = matScale* matTrans;
// 각 타일 구조체에 사이즈와 위치값을 벡터로 만들어주고 스크롤값을 더해줌
float fCenterX = pTexInfo->tTexInfo.Width >> 1;
float fCenterY = pTexInfo->tTexInfo.Height >> 1;
//마름모 이기때문에 그냥 설치할경우 배경이 보일수있음 왼쪽 모서리에서 그려주는것이 아닌 중앙에서 그려주기위해 센터값필요
CGraphic_Device::Get_Instance()->Get_Sprite()->SetTransform(&matWorld);
CGraphic_Device::Get_Instance()->Get_Sprite()->Draw(pTexInfo->pTexture, nullptr, &D3DXVECTOR3(fCenterX, fCenterY, 0.f), nullptr, D3DCOLOR_ARGB(255, 255, 255, 255));
swprintf_s(szBuf, L"%d", i);
CGraphic_Device::Get_Instance()->Get_Font()->DrawTextW(CGraphic_Device::Get_Instance()->Get_Sprite(), szBuf, lstrlen(szBuf), nullptr, 0, D3DCOLOR_ARGB(255, 0, 0, 0));
}
}
렌더 테라인 함수입니다 각 타일이 가지고있는 위치와 사이즈를 벡터로 만들고 센터값을 주어 렌더해줍니다.
bool CTerrain::Tile_Picking(const D3DXVECTOR3 & vMouse, int iIndex)
{
// 각 마름모의 네 꼭지점을 구해줌
D3DXVECTOR3 vTilePoint[4] =
{
{m_vecTile[iIndex]->vPos.x, m_vecTile[iIndex]->vPos.y + (TILECY >> 1), 0.f},
{ m_vecTile[iIndex]->vPos.x + (TILECX >> 1), m_vecTile[iIndex]->vPos.y , 0.f },
{ m_vecTile[iIndex]->vPos.x, m_vecTile[iIndex]->vPos.y - (TILECY >> 1), 0.f },
{ m_vecTile[iIndex]->vPos.x - (TILECX >> 1), m_vecTile[iIndex]->vPos.y , 0.f },
};
//각 꼭지점에서 시계방향으로 다음 꼭지점을 바라보는 방향벡터를 생성
D3DXVECTOR3 vTileDir[4] =
{
vTilePoint[1] - vTilePoint[0],
vTilePoint[2] - vTilePoint[1],
vTilePoint[3] - vTilePoint[2],
vTilePoint[0] - vTilePoint[3],
};
// 방향벡터의 수직인 벡터를 만듬 y와 x값을바꿔주고 -를 붙임 ( 2차원 한정)
D3DXVECTOR3 vNormal[4] =
{
{-vTileDir[0].y, vTileDir[0].x, 0.f},
{ -vTileDir[1].y, vTileDir[1].x, 0.f },
{ -vTileDir[2].y, vTileDir[2].x, 0.f },
{ -vTileDir[3].y, vTileDir[3].x, 0.f }
};
// 꼭지점에서 마우스를 바라보는 벡터 생성 마우스 - 방향벡터
D3DXVECTOR3 vMouseDir[4] =
{
vMouse - vTilePoint[0] ,
vMouse - vTilePoint[1] ,
vMouse - vTilePoint[2] ,
vMouse - vTilePoint[3]
};
// 두백터를 내적한값이 0보다 크다는것은 각이 에각이라는뜻 즉 마우스가 영역 바깥에있다
for (int i = 0 ; i < 4; ++i)
{
if (0 < D3DXVec3Dot(&vMouseDir[i], &vNormal[i]))
return false;
}
return true;
}
현재 마우스가 올려져있는 타일을 구해주는 피킹타일 함수입니다.
미니맵
로직
CWinApp->Mainfrm->mainSpliter->Toolview->terrain 순으로 있는 터레인을 가져와야함
미니맵을 만들기위해 뷰를 나눠주고 미니맵 클래스를 생성해줍니다.
void CMiniView::OnDraw(CDC* pDC)
{
SetTimer(0, 100, nullptr);
CDocument* pDoc = GetDocument();
// TODO: 여기에 그리기 코드를 추가합니다.
CGraphic_Device::Get_Instance()->Render_Begin();
CMainFrame* pMain = dynamic_cast<CMainFrame*>(::AfxGetApp()->GetMainWnd());
//전역함수를 통해 CWinApp을가져오고 GetMainWnd()를 통해 Cwnd를 가져오고 동적캐스팅을 해줌
CMFCToolView* pView = dynamic_cast<CMFCToolView*> (pMain->m_tMainSplitter.GetPane(0, 1));
// MainFrame에서 MainSpliter를 가져오고 Toolview를 가져와줌
// 뷰에 객체를 가져옵니다.
CTerrain* pTerrain = pView->m_pTerrain;
// 뷰에 있는 테라인 객체를 가져옵니다
pTerrain->Render_MiniMap_Terrain();
// 뷰와는 달리 맵전체를 렌더하는 미니맵 테라인 함수를 호출해줍니다.
CGraphic_Device::Get_Instance()->Render_End(m_hWnd);
}
void CTerrain::Render_MiniMap_Terrain()
{
int iSize = m_vecTile.size();
TCHAR szBuf[MAX_PATH] = {};
for (int i = 0; i < iSize; ++i)
{
const TEXINFO* pTexInfo = CTexture_Manager::Get_Instance()->Get_TexInfo_Manager(L"Terrain", L"Tile", m_vecTile[i]->iDrawID);
if (!pTexInfo)
return;
D3DXMATRIX matScale, matTrans, matWorld;
D3DXMatrixScaling(&matScale, 0.25f, 0.25f, 0.f);
D3DXMatrixTranslation(&matTrans, m_vecTile[i]->vPos.x / 4 , m_vecTile[i]->vPos.y / 4 , 0.f);
matWorld = matScale * matTrans;
//기존 렌더 함수와 달리 비율을 1/4로 줄여 렌더해줍니다.
//D3DXMatrixScaling(&matScale, 0.25f, 0.25f, 0.f);
//matWorld = matScale;
//이방식으로 해줄수도 있음
CGraphic_Device::Get_Instance()->Get_Sprite()->SetTransform(&matWorld);
CGraphic_Device::Get_Instance()->Get_Sprite()->Draw(pTexInfo->pTexture, nullptr, nullptr, nullptr, D3DCOLOR_ARGB(255, 255, 255, 255));
swprintf_s(szBuf, L"%d", i);
CGraphic_Device::Get_Instance()->Get_Font()->DrawTextW(CGraphic_Device::Get_Instance()->Get_Sprite(), szBuf, lstrlen(szBuf), nullptr, 0, D3DCOLOR_ARGB(255, 0, 0, 0));
}
}
Author And Source
이 문제에 관하여(타일과 미니맵), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jacod2/타일과-미니맵저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)