안녕하세요
이번 강좌에서는 플레이어 이동기능을 구현할겁니다.
이 부분만 잘 이해하시고 마친다면 남은 과정들은 다 비슷하기때문에 편하게 따라오실 수 있습니다.
[ 목차 ]
1. 플레이어 이동 구현방법
2. 플레이어 위치 저장하기
3. 플레이어 이동 구현하기
[1 플레이어 이동 구현방법]
먼저 기능을 구현하기전에 어떻게 구현할지 방법을 미리 생각해야합니다.
잘 생각해보면 지난 강좌를을 보면서
키보드가 눌렸을 때 무언가가 움직이도록 구현한적이 있습니다.
바로 메뉴선택기능입니다.
플레이어 이동도 방법은 똑같습니다.
다만 이동 범위가 위, 아래뿐만 아니라 좌, 우까지 움직인다는것입니다.
전에 잘 이해하였으면 큰 어려움은 없으실겁니다.
혹시나 이해가 가지않는다면 이전 강좌 중 메뉴 선택기능 구현하는 강좌를 확인하시기 바랍니다.
이동방식은 이전의 메뉴선택기능과 완전히 똑같습니다.
키보드가 눌리면 먼저 gotoxy로 커서를 옮기지 않고 현재의 위치로 이동합니다.
그리고 공백을 출력하여 기존의 플레이어를 지워버립니다.
그리고 좌표값을 증감시키고 이동할 위치로 커서를 옮기고 플레이어를 새로 출력합니다.
이런 과정을 통해 플레이어가 움직이게 구현할것입니다.
먼저 첫번째로 작업할 내용은
플레이어의 시작 좌표를 알아야합니다.
맵마다 플레이어가 시작하는 지점이 있죠?
이 지점부터 움직일수있도록 플레이어의 좌표값을 저장할겁니다.
다음 챕터로 진행합시다.
[2 플레이어 위치 저장하기]
game.h 헤더파일의 drawMap의 매개변수를 수정합니다.
원래는 void drawMap() 이었지만
현재는 int* 형 매개변수 2개가 추가되었습니다.
int* 은 정수형 포인터인데요
변수와는 조금 다릅니다.
포인터에 대해 잘 모르셔도 괜찮습니다.
아래에서 간단히 설명해드릴게요.
수정을 마쳤으면 game.c 소스코드로 가봅시다.
먼저 gLoop (게임루프)부분에 변수 두개를 선언해줍니다.
72행에 보이는것처럼 좌표값을 저장한 변수 2개를 선언해줍니다.
저는 변수명을 x, y로 정했습니다.
그리고 84행에 보이는것처럼 drawMap에 데이터를 넘겨줍니다.
&x, &y는 해당 변수의 메모리 주소를 넘겨줍니다.
포인터변수는 메모리 주소를 저장할 수 있습니다.
아까 위에서 수정하였던 int* 자료형이 바로 메모리의 주소를 저장할 수 있는 공간입니다.
72행에서 선언한 x, y를 잘 기억하고 계세요!
수정을 마쳤으면 drawMap 함수로 이동합니다.
함수 구현부분의 첫번째에서 받은 매개변수를 정의하고있습니다.
아까 &x, &y로 변수의 메모리 주소를 함수로 전달하였는데요
함수에서는 이 메모리주소를 int* 자료형에 담아두고있습니다.
57, 58행을 보시면
*x = w;
*y = h;
라고 되어있습니다.
x, y는 int* 자료형이고 현재 gLoop에서 선언한 x, y변수의 메모리 주소를 가지고있습니다.
이 주소에다가 좌표값을 직접 저장할겁니다.
* 연산자는 해당 메모리 주소에 접근합니다.
gLoop에서 선언한 x, y의 주소이므로 결국 gLoop에 있는 x, y 변수에 접근하는것이지요.
이렇게 접근하여 w(가로), h(세로)위치를 좌표에 저장하는 모습입니다.
이렇게 좌표를 저장해두면 플레이어가 어디서부터 움직일지 알 수 있겠죠?
포인터에 대해 더 알고싶으시면 아래 링크에서 확인하실 수 있습니다.
http://lghlove0509.blog.me/220911157817
플레이어의 좌표값을 저장하였으니 다음으로 진행해보도록 합시다.
[3 플레이어 이동 구현하기]
플레이어의 좌표값을 저장하였으니 이제 어디서부터 움직여야할지 알게되었습니다.
이제 움직이는 기능을 구현해봅시다.
먼저 전에 구현해두었던 keyControl 함수를 사용합니다.
키가 눌리면 이동을 해야하기 때문이죠
game.c 소스코드에 게임루프를 확인해봅시다.
위와같이 비어있던 while 문안에 switch문을 작성해줍니다.
키가 눌렸을 때 어떤 반응을 할지 선택하는 부분입니다.
위 상태로는 아무런 동작이 없으므로 반응이 없을겁니다.
움직이는 기능을 하는 함수를 하나 정의하고 구현해봅시다.
game.h 헤더파일에 함수를 정의합니다.
16행에 보이는 함수입니다.
저는 move라는 이름으로 정의했습니다.
매개변수는 정수형 포인터2개와 정수형 2개(총 4개)입니다.
정의하였으면 함수를 구현해봅시다.
game.c 소스코드에서 아래와 같이 구현하면 됩니다.
먼저 매개변수 설명을 하자면
첫 번째, 두 번째의 포인터 변수는 실제 좌표가 저장되어있는 변수의 메모리 주소입니다.
(위에서 플레이어 좌표저장하는 방식과 똑같음)
그리고 세, 네 번째 정수형 변수 _x, _y 는 x축으로 얼마나 이동할지, y축으로
얼마나 이동할지에 대한 값을 저장하는 변수입니다.
플레이어가 _x또는 _y만큼 이동하게되면 실제 좌표값에도 반영시켜야하기 때문에 위와같이 매개변수를 받습니다.
이동기능은 아래와 같이 구현할 수 있습니다.
113행의 setColor는 이상한 색으로 출력될 수 있기때문에 미리 기본값인
흰 텍스트에 검정 배경으로 설정하였습니다.
113~115 부분은 키가 눌리기 이전의 좌표로 이동하여 플레이어를 지워버리는 모습입니다.
117~119 부분은 x, y의 증감값의 위치(이동할 위치)로 이동하여 플레이어를 출력하는 모습입니다.
마지막으로 121, 122부분은 증감값을 실제 플레이어 좌표로 적용시키는 모습입니다.
*x += _x;
위 문법은 *x = *x + _x 와 같습니다.
gLoop에서 선언한 x, y 변수의 주소값이기때문에
gLoop의 x, y변수값을 변경하는것과 똑같습니다.
move 함수는 이렇게 구현하고 실제로 사용해봅시다.
게임루프안에 move함수를 호출합니다.
매개변수로는 실제 x, y 좌표값이 들어있는 x, y변수의 주소값과
x, y축으로 얼마나 이동할지에 대한 값을 입력해주시면 됩니다.
빨간 네모친 부분을 보시면 첫 번째 숫자가 x, 두 번째 숫자가 y입니다.
0으로 전달하면 움직이지 않는것이구요 1, -1을 전달하면 한칸 움직이기,
2, -2를 전달하면 두칸 움직입니다.
콘솔게임은 좌표가 세밀하지 않기때문에 주로 1칸씩만 움직입니다.
좌표는 아래를 참조해주세요
주의할 사항은 x축은 수학과 마찬가지로 1이 증가하면 오른쪽으로 이동하지만
y축은 반대로 1이 증가하면 아래로 내려갑니다.
이점 감안하여 작성해주세요
move함수 호출부분을 모두 마쳤으면 한번 테스트해보세요!
(실행결과)
저는 조작키를 w, a, s, d로 설정하였는데 원하는 방향으로 잘 움직입니다
플레이어가 움직이긴 하는데 문제가 하나 있습니다.
벽이고 뭐고 다 통과하는 문제가 있습니다.
실제로 drawMap으로 출력한 맵은 그저 보이기만할뿐입니다.
벽이있으면 통과하지 못하게, 아이템이 있으면 습득하도록.. 등등
이런 부분에 대한 내용은 직접 코딩으로 구현하셔야합니다.
하지만 걱정하지마세요
앞으로 남은 강좌에서 모드 진행할 내용입니다.
다음 강좌에서는 화면 하단에 정보를 보여줄 영역을 구현하고 게임 도중에 나갈 수 있는 기능을 구현하도록 하겠습니다.
감사합니다.