이번 글에선 캐릭터를 뱀파이어 서바이버처럼 움직이게 하는 코드를 설명하겠다.
결론부터 말하면 뱀파이어 서바이버는 캐릭터가 움직이지 않는다.
캐릭터는 항상 중앙에 고정되어있다. 그렇다면 왜 나는 움직인다고 느낀걸까?
답은 간단하다. 캐릭터가 움직인게 아니라 배경과 몬스터들이 움직였기 때문이다.
마치 속도의 상대성처럼 캐릭터를 오른쪽으로 이동하라 명령하면 배경과 몬스터들이 왼쪽으로 이동한다.
즉 캐릭터의 좌표를 건드는게 아니라, 비트맵을 움직이게 하면 된다.
앞선 글에서 움직임을 구현하는 코드를 작성했다.
이 코드에서 움직일 좌표를 계산했는데 이 좌표들을 이용해서 배경을 움직이게한다.
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;
}
움직임 함수에 여러 코드를 추가했는데, 배경의 밖으로 걸어가면 안되기 때문에
배경의 최대 이동 거리를 제한한 것이다.
'개발 프로젝트 > Win32 - VampireSurvivor 모작' 카테고리의 다른 글
로그라이크 게임 구현 2주차 (2) (0) | 2022.04.07 |
---|---|
로그라이크 게임 구현 2주차 (1) (0) | 2022.03.24 |
로그라이크 게임 구현 1주차(4) (0) | 2022.03.24 |
로그라이크 게임 구현 1주차 (3) (0) | 2022.03.24 |
로그라이크 게임 구현 - 1주차 (2) (0) | 2022.03.24 |