타일과 미니맵

수업에서 중요하다 생각하는 부분을 정리하며 복습하기위해 작성한 글입니다.

타일

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));
	}


}

좋은 웹페이지 즐겨찾기