안녕하세요
이번 강좌에서는 맵 오브젝트 제어[1]입니다.
이전에는 벽을 그냥 뚫고 지나갈 수 있었지만 오늘 벽 부분에 대해서 제어를 할것입니다.
[ 목차 ]
1. 벽 통과되는 이유 알기
2. 벽 통과 못하게 제어하기
[1 벽 통과되는 이유 알기]
이전에 drawMap 함수를 구현하여 맵을 출력하였습니다.
맵이 잘 출력되었는데요
벽으로 이동하면 멈추지않고 그냥 뚫고 지나가버립니다.
위 사진은 배열데이터를 기반으로하여 출력을 했을때의 상황입니다.
저는 1이 벽, 0이 빈 공간, p가 플레이어였으므로 위와같이 그렸습니다.
맵을 그렸기만했지 다른 처리를 하지않았습니다.
출력된 맵을 뷰(View)영역이라고 생각하고 이제부터는
배열데이터와 완전 다른 세계에 있다고 생각하셔야합니다.
뷰 영역은 그저 보이기만할뿐 아무런 기능이 없습니다.
뷰를 출력하기 위한 내부 기능에 추가해야하는 사항입니다.
아래 사진은 실제 플레이어 이동을 담당하는 함수입니다.
w 키가 눌리면 무조건 위로 올라가고
a키가 눌리면 무조건 왼쪽으로 이동하게됩니다.
움직이는 부분에 벽, 아이템(추가예정)에 대한 제어부분이 없기때문에 벽을 통과하는
문제가 발생하는것입니다.
이제 이유를 알게되었으니 벽에대한 제어를 해봅시다.
[2 벽 통과 못하게 제어하기]
game.c 소스코드 내의 move 함수에 제어하는 기능을 추가해봅시다.
119행(빨간 밑줄)을 보시면 mapObject 라는 변수에 배열 값 한개를 가져오고있습니다.
맵 배열데이터 중 이동할 위치에 있는 데이터를 가져오는 부분입니다.
(저의 경우)
만약 d키를 눌렀으면 오른쪽으로 이동하도록 구현되어있습니다.
그러니 현재 위치에서 한칸 오른쪽에 있는 맵 데이터를 실제로 이동시키기 전에 임시로 가져오는 부분입니다.
그러면 이동할 위치의 맵 데이터가 mapObject 변수에 저장되어있겠죠?
이 mapObject 변수의 값을 판별하여 이동할지 이동하지 않을지 등등에 대한 제어를 하면 됩니다.
122행을 보시면 맵 데이터가 0일때만 움직이도록 되어있습니다.
132 부분의 else if 에는 1이면 아무런 동작을 하지 않게 되어있구요
아무런 동작도 하지않고 코드도 작성할 필요가 없기때문에 132행의 else if 부분은 다 지워도 됩니다. (132행~135행)
위처럼 소스코드를 수정하고 추가하신 후 실행시켜보시면 벽을 통과하던 문제가 해결됩니다!
다음 강좌에서는 맵 오브젝트 제어[2] 에 대해 진행하도록 하겠습니다.
(열쇠 아이템 추가 및 잠긴 문 추가)
감사합니다.