현재 게임에선 플레이어가 이동할경우 스크롤이 계속증가하여 배경인 간디가 보이는곳까지 넘어갑니다.
여기서 스크롤매니저에서 스크롤 락 함수를 추가하여 스크롤이 타일이 깔아직 맵 바깥으로 나갈경우 더이상 이동하지 못하도록 막아보겠습니다.
스크롤 락
void CScroll_Manager::Scroll_Lock()
{
if (0 < m_iScrollX)
m_iScrollX = 0;
if (0 < m_iScrollY)
m_iScrollY = 0;
if (WINCX - TILECX * TILEX > m_iScrollX)
m_iScrollX = WINCX - TILECX * TILEX;
if (WINCY - TILECY * TILEY > m_iScrollY)
m_iScrollY = WINCY - TILECY * TILEY;
// x축 조건은 0과 -480 ;
// y축은 0보다 크면서 - 1320
}
스크롤 매니저에 스크롤 락 함수를 선언 해줍니다 우선 지금 게임에선 맨좌측 상단 좌표가 (0,0)이므로 스크롤값이 0보다 커진다면 0으로 만들어줍니다
다음은 X축으로는 오른쪽 Y축으로는 아래쪽을 막아줘야하는데 여기선 현재 값을 정수값으로 넣어도 되지만 그렇다면 게임의 맵 크기가 수정될떄 마다 그 값또한 수정해줘여할것입니다.
그렇기때문에 스크롤값의 최솟값을 구해주면 X축의 경우 WINCX에서 타일의 X크기 * 타일의 X갯수를 곱해서 빼주면 최소값을 알수있고 만약 스크롤값이 이 값보다 더 작아진다면 초기화 해주면됩니다. Y축도 마찬가지입니다.
CKey_Manager::Get_Instance()->Key_Update();
CScene_Manager::Get_Instance()->Update_Scene_Manager();
CScroll_Manager::Scroll_Lock();
다음은 MainApp에서 모든값을 Update를 돌린다음 스크롤을 막아주면됩니다.
플레이어 스크롤 동기화
하지만 아직 플레이어가 이동할때 플레이가 이동하지못하더라도 스크롤이 이동해버리는경우가 생기기때문에 이를 막아주기위해 플레이어가 이동키를 누를 때 무조건적으로 이동하는것이아닌 값을 동기화 해주어야합니다.
우선 플레이어의 Update부분에서 이동키를 입력받았을때 SetScroll해주던 부분을 모두 빼주고
스크롤 무브 함수를 추가해줍니다
void CPlayer::ScrollMove()
{
int iScrollX = CScroll_Manager::Get_ScrollX();
int iScrollY = CScroll_Manager::Get_ScrollY();
if ((WINCX >> 1) < m_tInfo.fX + iScrollX + 100)
CScroll_Manager::Set_ScrollX(-m_fSpeed);
if ((WINCX >> 1) > m_tInfo.fX + iScrollX - 100)
CScroll_Manager::Set_ScrollX(m_fSpeed);
if ((WINCY >> 1) < m_tInfo.fY + iScrollY + 100)
CScroll_Manager::Set_ScrollY(-m_fSpeed);
if ((WINCY >> 1) > m_tInfo.fY + iScrollY - 100)
CScroll_Manager::Set_ScrollY(m_fSpeed);
}
스크롤 무브함수는 현재 맵의 중점값 과 플레이어의 좌표에 스크롤값을 더한값을 조정하여 스크롤값을 조정하여 줍니다 이렇게 하면 무조건 플레이와 스크롤이 같이 이동하는 것이아니라 플레이어가 중점에서 일정 부분(여기선 100) 을넘어갈경우부터 스크롤값이 변할것입니다.