Windows API
#라인타기
HYuk
2021. 6. 11. 16:58
728x90
횡스크롤 게임에서는 라인을 따라서 움직여야하고
위쪽 라인으로 점프를 하게 되면 위쪽라인을 타다가
다시 라인이 끝나면 자연스럽게 아래라인으로 착지해야한다.
플레이어의 x좌표가 라인의 왼쪽점과 오른쪽점 사이에 있고,
(라인의 y좌표 - 플레이어의 y좌표) >0 일 경우,
라인을 태우면된다.
이때, 라인은 여러개 있고, 라인마다 각각 플레이어의 좌표와 비교를 해주어야 하며,
같은 x범위를 만족한다고 하여도, y축 좌표가 플레이어와 거리가 짧은 순으로 우선해야한다.
따라서 모든 라인과 플레이어를 비교해보고 (라인의 y좌표 - 플레이어의 y좌표) >0 인 경우에 한하여
그 값이 가장 작은것을 찾아 플레이어에게 y좌표를 넘겨주어야 한다.
그 코드를 다음과 같이 구성해보았다.
if (m_listLine.empty())
return false;
bool bCheck = true;
float fHighest_Y = 0.f;
for (auto& pLine : m_listLine)
{
if (pLine->Get_Info().tLeftPos.fX <= _x
&& pLine->Get_Info().tRightPos.fX >= _x) // x 사이에 있으면,
{
float x1 = pLine->Get_Info().tLeftPos.fX;
float y1 = pLine->Get_Info().tLeftPos.fY;
float x2 = pLine->Get_Info().tRightPos.fX;
float y2 = pLine->Get_Info().tRightPos.fY;
float fCheck_Y = ((y2 - y1) / (x2 - x1)) * (_x - x1) + y1;
float fGradient_Y = (y2 - y1) / (x2 - x1);
if (((fCheck_Y - _y >= 0) && (fHighest_Y - _y > fCheck_Y - _y)) || (bCheck && Check_Y - _y >= 0))
{
fHighest_Y = fCheck_Y;
bCheck = false;
}
}
}
if (!bCheck)
{
*_Sety = fHighest_Y;
return true;
}
return false;
728x90