본문 바로가기

개발 프로젝트/Win32 - VampireSurvivor 모작

로그라이크 게임 구현 1주차 (5)

 이번 글에선 캐릭터를 뱀파이어 서바이버처럼 움직이게 하는 코드를 설명하겠다.

 

 결론부터 말하면 뱀파이어 서바이버는 캐릭터가 움직이지 않는다.

캐릭터는 항상 중앙에 고정되어있다. 그렇다면 왜 나는 움직인다고 느낀걸까?

답은 간단하다. 캐릭터가 움직인게 아니라 배경과 몬스터들이 움직였기 때문이다.

마치 속도의 상대성처럼 캐릭터를 오른쪽으로 이동하라 명령하면 배경과 몬스터들이 왼쪽으로 이동한다.

 

즉 캐릭터의 좌표를 건드는게 아니라, 비트맵을 움직이게 하면 된다.

앞선 글에서 움직임을 구현하는 코드를 작성했다.

이 코드에서 움직일 좌표를 계산했는데 이 좌표들을 이용해서 배경을 움직이게한다.

 

void CharacterMoveFun()
{
    POINT newPoint;
    if (keyLayout[VK_LEFT] == keyLayout[VK_RIGHT])
        newPoint.x = 0;
    else if (keyLayout[VK_LEFT])
        newPoint.x = -7;
    else 
        newPoint.x = +7;


    if (keyLayout[VK_UP] == keyLayout[VK_DOWN])
        newPoint.y = 0;
    else if (keyLayout[VK_UP]) {
        newPoint.y = -7;
        if (keyLayout[VK_LEFT]) {
            newPoint.x = -5;
            newPoint.y = -5;
        }
        else if (keyLayout[VK_RIGHT]) {
            newPoint.x = 5;
            newPoint.y = -5;
        }
    }    
    else {
        newPoint.y = +7;
        if (keyLayout[VK_LEFT]) {
            newPoint.x = -5;
            newPoint.y = 5;
        }
        else if (keyLayout[VK_RIGHT]) {
            newPoint.x = 5;
            newPoint.y = 5;
        }
    }
    if ((posBmpBackGround.x - newPoint.x) + (infoBmpCharacterRunning.bmWidth / 2) > 0)
        return;
    else if ((posBmpBackGround.y - newPoint.y) + infoBmpCharacterRunning.bmHeight > 10)
        return;
    else if ((posBmpBackGround.x - newPoint.x) - infoBmpCharacterRunning.bmWidth < ((rc.right - rc.left)) - infoBmpBackGround.bmWidth)
        return;
    else if ((posBmpBackGround.y - newPoint.y) - infoBmpCharacterRunning.bmHeight < ((rc.bottom - rc.top)) - infoBmpBackGround.bmHeight)
        return;
    else {
        MoveBackGroundFun(newPoint);
        MoveMonsterWithBackGroundFun(newPoint , strMonsterList);
    }
}

 

void MoveBackGroundFun(POINT pos)
{
        posBmpBackGround.x -= pos.x;
        posBmpBackGround.y -= pos.y;
}

 

 

움직임 함수에 여러 코드를 추가했는데, 배경의 밖으로 걸어가면 안되기 때문에

배경의 최대 이동 거리를 제한한 것이다.