๊ณต๋ถ์๊ฐ : 0h 0min
์์ํด์ฃผ๋ ์ฌ๋๋ค์ ์ผ๊ตด๊ณผ ๋ง๋ค์ ๋ ์ฌ๋ ค
A* ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ ๋ณต์ต ๋ฐ ์ดํด. : **์ฝ๋๋ฅผ ์์ ๋๊ณ ๊ฐ์ด ๋ฐ๋ผ ์ฝ์ด๊ฐ๋ฉด ์ดํดํ๊ธฐ ์ข์. โ ๋๋ต์ ์ธ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๊ด โ
ํ์ผ์ ์ํํ๋ฉฐ ์ธ์ ํ์ผ์ ๋น์ฉ์ ๊ณ์ฐ ํ, ์ ๋ ฌ, โ OpenList์ ์ ์ฅ. (๊ณ์ฐ ๋ ํ์ผ์ CloseList์ ์ ์ฅ.)
๋น์ฉ์ด ๊ฐ์ฅ ์์ ํ์ผ๋ถํฐ ํ๋์ฉ ์ฌ๊ท์ ์ผ๋ก ์ธ์ ํ์ผ ๋น์ฉ ๊ณ์ฐ.
๊ณ์ฐ ํด๊ฐ๋ฉฐ ์ ์ธ์ ํ์ผ์ ๊ณ์ฐํ ๋. ํ์ผ์ iParentIndex ์ ์ด์ ํ์ผ ์ ์ฅ.
์ ์ ๋น์ฉ๋๋ก ์ธ์ ํ์ผ ๊ณ์ฐํ๋ค๋ณด๋ฉด ๋ชฉํํ์ผ์ ๋ง๋๊ฒ ๋จ.
Best List์ ๋ชฉํํ์ผ์ iParentIndex ๋ถํฐ ์ญ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ ์ ์ฅ.**
[Picking()]
Terrain class ์ vecTile์ ๊ฐ์ ธ์ด.
ํ์ฌ Index์ ํด๋นํ๋ ํ์ผ์ ๋ค ๊ผญ์ง์ ์ vPoint[4]์ ์ ์ฅ.
vPoint๋ฅผ ํตํด ์๊ณ๋ฐฉํฅ์ผ๋ก ํฅํ๋ ๋ค ๋ฐฉํฅ ๋ฒกํฐ๋ฅผ ๊ตฌํด์ vDir[4]์ ์ ์ฅ
vDir[i]์ ๊ฐ ๋ฒ์ ๋ฒกํฐ๋ฅผ ๊ตฌํจ. 2์ฐจ์์์ (x, y)์ ๋ํ ๋ฒ์ ๋ฒกํฐ๋ (-y, x) ์ด๋ค. vNormal[4]์ ์ ์ฅ.
๊ฐ vPoint์์ ๋ง์ฐ์ค ํด๋ฆญ ํฌ์ธํธ vPos ๋ก ํฅํ๋ ๋ฒกํฐ๋ฅผ ๊ตฌํด์ vMouseDir[4]์ ์ ์ฅ
vMouseDir[i] ๊ณผ vNormal[i] ์ ๊ทํ ํ ๋ค, ๋ด์ ํจ.
ํผํน ํฌ์ธํธ๊ฐ ๋ง๋ฆ๋ชจ ์์ชฝ.
vMouseDir[i] ๊ณผ vNormal[i]์ด **๋๊ฐ(ฮธ > 90)**์ ์ด๋ฃฌ๋ค. โ ฮธ > 90 ์ด๋ฏ๋ก, ์ ๊ทํํ ๋ฒกํฐ๋ฅผ ๋ด์ ํ์ฌ ๋์ค๋ cosฮธ ์ ๊ฐ์ด ์์์ด๋ค. (๊ทธ๋ฆผ์ฐธ์กฐ)

ํผํน ํฌ์ธํธ๊ฐ ๋ง๋ฆ๋ชจ ๋ฐ๊นฅ์ชฝ.
๋ด์ ๊ฐ์ด ํ๋๋ผ๋ ์์์ผ ๊ฒฝ์ฐ, ํ์ผ์ ๋ฐ๊นฅ์ชฝ์ด๋ผ ํ๋จํ์ฌ false๋ฅผ ๋ฐํ.


[Picking()] vPos๊ฐ ํ์ฌ ์ํ์ค์ธ Index์ ํ์ผ์ ์์ชฝ์ผ ๊ฒฝ์ฐ โ true๋ฅผ ๋ฐํ
bool CAstarMgr::Make_Route(int iCurIdx, int iGoalIdx)
{
// ํ์ผ ๊ด๋ จ ์ ๋ณด ๊ฐ์ ธ์ค๋ ๊ฒ.
CObj* pTerrain = CObjMgr::Get_Instance()->Get_Terrain();
if (nullptr == pTerrain)
goto Jump;
vector<TILE*>& vecTile = dynamic_cast<CTerrain*>(pTerrain)->Get_VecTile();
if (vecTile.empty())
goto Jump;
vector<list<TILE*>>& vecAdj = dynamic_cast<CTerrain*>(pTerrain)->Get_Adj();
if (vecAdj.empty())
goto Jump;
/*=======================================================*/
// ๋๋ฒ ์งธ ์ดํ์ Make_Route ํจ์ ์คํ ์ํ ์ธ ๊ฒฝ์ฐ.
// ํ์ฌ iCurIdx๊ฐ m_OpenList.front() ์ด๋ฏ๋ก, m_OpenList.pop_front() ํด์ค.
if (!m_OpenList.empty())
m_OpenList.pop_front();
// ํ์ฌ iCurIdx์ ํ์ ์๋ฃ๋ ํ์ผ๋ก push_back ํด์ค.
m_CloseList.push_back(iCurIdx);
// ํ์ฌ Index์ ํด๋นํ๋ ๋ฒกํฐ์ ์ธ์ ํ์ผ๋ค์ ์ํ.
for (auto& AdjTile : vecAdj[iCurIdx])
{
// ํ์ฌ ์ํ์ค์ธ ์ธ์ ํ์ผ์ด ๋ชฉํ ํ์ผ์ผ ๊ฒฝ์ฐ
// -> ํ์ฌ ์ํ์ค์ธ ์ธ์ ํ์ผ(๋ชฉํํ์ผ)์ iParentIndex์ iCurIdx ๊ธฐ์
.
// -> ํ์ ์ข
๋ฃ.
if (iGoalIdx == AdjTile->iIndex)
{
AdjTile->iParentIndex = iCurIdx;
return true;
}
// ๋ชฉํ ํ์ผ์ด ์๋์๋ค,
// ํ์ฌ ์ํ์ค์ธ ์ธ์ ํ์ผ์ด Opon, Close ๋ฆฌ์คํธ์ ์๋์ง ์กฐ์ฌ
if (false == Check_Close(AdjTile->iIndex) &&
false == Check_Open(AdjTile->iIndex))
{
// ํ์ฌ ์ํ์ค์ธ ์ธ์ ํ์ผ์ iParentIndex์ iCurIdx ๊ธฐ์
.
// ์ต๋จ ๋น์ฉ ๊ณ์ฐ์ ์ํด OpenList์ ํ์ฌ ์ํ์ค์ธ ์ธ์ ํ์ผ ์ ์ฅ. x 4.
AdjTile->iParentIndex = iCurIdx;
m_OpenList.push_back(AdjTile->iIndex);
}
}
// ๋ ์ด์ ์ฐพ์ ๊ธธ์ด ์์ ๊ฒฝ์ฐ
if (m_OpenList.empty())
goto Jump;
int iStart = m_iStartIdx;
// ์ด๋๊ฐ๋ฅํ ์ธ์ ํ์ผ๋ค์ h(), g() (์ด๋ ๋น์ฉ (๊ฐ์ค์น) ) ๋ฅผ ๊ณ์ฐํ์ฌ
// Open List ์์ ์ ๋ ฌํจ --> ๊ฐ์ฅ ๋น์ฉ์ด ์์ Front๋ถํฐ ์ธ ์์ .
// list ์์ ์ํ.
m_OpenList.sort([&vecTile, &iStart, &iGoalIdx](int Temp, int Sour)->bool
{
// cost = PCost + GCost
// ์์์ ํ์ผ์์ ํ์ฌ ํ์ผ๊น์ง์ ์ด๋๊ฐ๋ฅํ ์ธ์ ํ์ผ๊น์ง์ ๊ฑฐ๋ฆฌ ๋น์ฉ.
D3DXVECTOR3 vPCost1 = vecTile[iStart]->vPos - vecTile[Temp]->vPos;
D3DXVECTOR3 vPCost2 = vecTile[iStart]->vPos - vecTile[Sour]->vPos;
// ์ด๋๊ฐ๋ฅํ ์ธ์ ํ์ผ๋ก๋ถํฐ ๋ชฉํ ํ์ผ๊น์ง์ ๊ฑฐ๋ฆฌ ๋น์ฉ
D3DXVECTOR3 vGCost1 = vecTile[Temp]->vPos - vecTile[iGoalIdx]->vPos;
D3DXVECTOR3 vGCost2 = vecTile[Sour]->vPos - vecTile[iGoalIdx]->vPos;
float fDist1 = D3DXVec3Length(&vPCost1) + D3DXVec3Length(&vGCost1);
float fDist2 = D3DXVec3Length(&vPCost2) + D3DXVec3Length(&vGCost2);
// ์ค๋ฆ์ฐจ์ ์ ๋ ฌ.
return fDist1 < fDist2;
});
// ์ด๋๋น์ฉ์ด ๊ฐ์ฅ ์์ ํ์ผ์ ์์์ ์ผ๋ก ๋ค์ Make_Route์คํ.
return Make_Route(m_OpenList.front(), iGoalIdx);
Jump:
return false;
}
์ฉ์ฑ ๋ณต์ตํ๊ธฐ. : 11:40 ~ 13:00 : ํ์ด์ง : ใ ~ ใ 1.