카메라가 보는 곳이 화면의 중앙
obj pos는 실제 obj의 위치
카메라에 따라 obj이가 보이는 위치가 달라져야 한다.
실 좌표와 출력 좌표가 나뉘어 져야한다
렌더링을 진행 할때만 좌표를 카메라에 따라 달리 해준다
카메라가 있었진 않지만 현재 카메라의 위치는 해상도의 중앙이다
따라서 카메라가 처음 보는 곳이 해상도 중앙
모든 obj들이 camera를 알고 있어야함, 자식obj헤더에서 카메라헤더 파일참조
카메라가 움직인다면
카메라가 해상도 중앙에서 이동한 거리만큼
물체들은 반대쪽으로 이동해야 함
render pos는 실제 위치에서 중앙으로부터 차이를 빼주면 나온다
Vec2 CCamera::GetRenderPos(Vec2 _vObjPos)
{ //중앙으로부터의 차이
return _vObjPos - m_vDiff;
}
매 업데이트 마다 타겟 obj의 위치를 카메라 중심으로 한다
void CCamera::update
{
if (m_pTargetObj)
{
if (m_pTargetObj->IsDead())
m_pTargetObj = nullptr;
else { m_vLookAt = m_pTargetObj->GetPos(); }
}
}
마우스 클릭이 발생하면 그 좌표에 카메라가 속력과 함께 이동한다
POINT ptPos = {};
GetCursorPos(&ptPos);//마우스 위치를 컴퓨터 스크린 기준으로 알려줌
현재 윈도우와 스크린의 차이값이 발생
//현재 윈도우기준 값으로 바꿔준다
ScreenToClient(CCore::GetInst()->GetMainHwnd(),&ptPos);
m_vCurMousPos = Vec2((float)ptPos.x, (float)ptPos.y);
클라이언트 속 마우스 좌표는 카메라 렌더링 중의 좌표이다
카메라의 위치는 실 위치를 알아야 하므로 렌더링->실제 좌표로 바꿔야 한다
Vec2 CCamera::GetRealPos(Vec2 _vObjPos)
{
return m_vDiff + _vObjPos;
}
마우스 좌 클릭하면 그곳의 실 좌표를 카메라로 하고 이동진행 시간을 0초로 초기화 한다
void SetLookAt(Vec2 _vLook) { m_vLookAt = _vLook; m_frunningtime = 0.f; }
Vec2 vLookDir = (m_vLookAt - m_vPrevLookAt);//쫓아갈 방향 벡터
void CCamera::CalDiff(){
Vec2 vLookDir = (m_vLookAt - m_vPrevLookAt);//쫓아갈 방향 벡터
m_frunningtime+=fDT;
if (m_frunningtime >= m_ftime)
{ m_vCurLookAt = m_vLookAt;
m_frunningtime = 0.f; m_fspeed = 0.f;
}
//이동진행 시간이 목표 시간보다 같거나 클때,위치를 현재 위치를 목적지로 옮긴다
else
{ if(m_fspeed==0.f)
m_fspeed = fdistance / m_ftime;//등속도 지정
m_vCurLookAt = m_vPrevLookAt + (vLookDir.Normalize() * m_fspeed * fDT);
}
m_vDiff = m_vCurLookAt-vCenter ;// 현재 카메라와 화면중앙의 차이
m_vPrevLookAt = m_vCurLookAt;//현재 지점이 이전 지점이 된다
}
}