티스토리 뷰

안녕하세요



이번 강좌에서는 게임의 전반적인 기능을 사용하고 관리하는 게임 루프를 구현하도록 하겠습니다.




[ 목차 ]


1. 게임 루프 구현하기


2. 플레이어 이동 구현하기





[1 게임 루프 구현하기 ]



게임루프란 무엇일까요?


게임을 진행하기 위한 반복이라고 생각하시면 됩니다.



게임이 종료될때까지 무한정 반복을 하는것입니다.




지금까지 강좌를 진행하면서


커서 위치를 옮기고 색깔도 설정하고 키보드 입력도 받을 수 있게되었는데요

이 기능들을 사용하여 게임을 개발해볼겁니다.





게임 루프는 위와같이 구성할 예정입니다.


메인메뉴에서 게임을 시작하고 맵을 선택하면


처음에 초기화를 합니다.

그리고 맵을 출력하고나서


게임 루프에 진입합니다.


게임 루프에서는 게임이 종료될 때까지 계속 반복하며 키보드 이벤트를 처리하고

화면을 업데이트합니다.



플레이어가 움직였다면 화면에 반영시켜줘야겠죠?


이 과정이 화면 업데이트입니다.




어려운건 없으니 코드로 구현해봅시다.




먼저 아래와같이 게임 루프를 구현할 함수를 game.h에 하나 정의합니다.

저는 gLoop 라고 함수명을 정하였습니다.


매개변수는 int형 하나 있으니 위와같이 정의해주세요




정의하였으니 이제 함수를 구현합시다.



함수를 구현하기 전에 game.c 소스코드로 이동하여 맵 배열을 수정합시다.


4행을 보시면 tempMap이라는 비어있는 2차원 배열이 하나 추가로 선언되어있습니다.


이 배열을 사용하는 이유는 맵이 여러개일때, 플레이어가 선택한 맵을 임시로 저장하기 위해 선언한 배열입니다.

임시로 저장할것이기때문에 원본맵 배열과 크기는 일치해야합니다.


저는 쉬움, 어려움 맵이 2개이므로 


기존에 선언해두었던 map 배열을 


map1 로 바꾸고

복사하여 map2 하는 배열을 추가로 생성했습니다.



맵을 5개 만들고싶으시면 위와같이 복사해서 5개 만드시면 됩니다!

(맵 구성요소는 직접 꾸미시면 됩니다)



이제 맵 출력도 임시로 저장되어있는 tempMap 배열을 통해 출력될 예정입니다.


아래 코드를 확인합시다.

49행에 중요한부분이 있습니다.


기존에는 map 배열을 그대로 읽어서 출력하였지만 이제부터는 tempMap에 복사한 후 출력할것이기 때문에


char temp = tempMap[h][w]


로 수정해줍시다.


그리고 아래쪽에 Sleep 함수는 이제 불필요하기때문에 지워주시면 됩니다.




이제 본격적으로 gLoop 함수를 구현합시다.


game.c 소스코드에 아래와 같이 구현합니다.

72행의 int playing 변수는 게임이 진행중인지 종료되었는지 저장할 변수입니다.


1이면 참, 0이면 거짓기 되기때문에 처음에는 1로 초기화해줍시다.




76~80행은 사용자가 선택한 맵을 위에서 선언한 tempMap에 복사하는 코드입니다.


만약 mapCode가 0이면 map1을 복사(쉬운맵)

1이면 map2를 복사(어려운 맵)

2이면... (이부분은 여러분들이 맵을 더 추가하셨으면 똑같이 진행하시면 됩니다)





memcpy 함수는 


memcpy(저장할 공간, 복사할 원본, 크기)


로 총 3개의 매개변수를 받습니다.




우리는 map1 또는 map2의 데이터를 tempMap에 복사할것이므로 


위와같이 코드를 작성해줍니다.


sizeof() 연산자는 해당 공간의 크기를 알려주는 기능을 합니다.


맵을 선택했으면 출력해야겠죠?


아래 82행처럼 drawMap 함수를 호출합시다.


이렇게되면 맵 출력까지 마친 상태가 됩니다.





아래 85행처럼 while 문을 추가해줍니다. 조건으로는 위에서 선언한 playing 변수를 넣어주시면 됩니다.

이 while 문이 이제 게임루프가 될것입니다.



루프를 구현해놓았으니 한번 테스트해봅시다.


테스트 전에 main.c 소스코드를 수정해봅시다.



지난번에 추가했던 drawMap 함수호출을 지우고 gLoop를 호출합니다.


매개변수로는 위에서 정한 숫자를 전달하면 됩니다.


저같은경우에는 0일때 쉬운맵 복사, 1일때 어려운맵 복사였기때문에 위와같이 0, 1을 전달하였습니다.



이렇게 코드를 작성하고

프로그램을 실행시키고 게임시작 > 쉬운맵을 선택하게되면


쉬운맵이 tempMap에 복사된 후 drawMap 함수로 인해 맵이 출력될것입니다.


그리고 while(playing) 게임루프로 진입하여 게임이 진행되겠죠.


한번 실행시켜봅시다.



실행시켜보면 맵이 잘 출력될것입니다.


하지만 문제가있습니다.


움직이지도 않고 게임이 종료되지도 않기때문입니다.



이유는 아래와 같습니다.



맵을 출력하고 루프로 들어오게 되었는데

현재까지는 무한루프이기때문에 아무런 동작도 하지 못하고 무한정 기다리기 때문입니다.



이번 강좌는 게임루프를 구현하는 과정이었습니다.






다음 강좌에서는 플레이어 이동 및  화면 업데이트기능을 구현하도록 하겠습니다. 


감사합니다.


댓글
  • 프로필사진 Now_Start 지금껏 따로 헤더파일을 분리하지 않고 프로젝트를 진행해왔는데, memcpy 부분에서 각 난이도의 맵과 tempMap을 인식하지 않습니다. 어떻게 해야 하나요...? ㅠㅠ 2020.02.27 22:00
  • 프로필사진 BlogIcon 이근둥 함수 선언부가 함수 호출보다 아래 부분에 위치하는 등 여러 요인이 있을 수 있습니다. 코드 없이 자세하 답변드리긴 어렵네요..ㅜ 2020.03.04 08:45 신고
  • 프로필사진 룰루랄라 도움 정말 많이 받아갑니다!!! 감사합니당 ㅎㅎㅎㅎ 2020.12.13 16:56
  • 프로필사진 github 안녕하세요!! 제가 지금 오류가 계속 뜨는데 혹시 봐주실 수 있을까요?? 카톡이나 메일 좀 알려주실 수 있을까요? 2021.05.22 16:12
댓글쓰기 폼