이근둥
근둥이의 블로그
이근둥
전체 방문자
874,952
오늘
323
어제
187

공지사항

  • 전체보기 (107)
    • 웹 (9)
    • 언어 & 프레임워크 (53)
      • JavaScript (7)
      • TypeScript (0)
      • Node.js (11)
      • Vue.js (3)
      • React (0)
      • React Native (0)
      • C & C++ (19)
      • Java & JSP (9)
      • Python (4)
    • 컴퓨터 과학 (3)
      • 알고리즘 (0)
      • 자료구조 (3)
    • 기타 (9)
      • Linux (1)
      • Git (2)
      • DialogFlow (4)
    • 일상 (13)
      • 게임 (13)
    • 칼럼 (9)
      • 회고 (0)
      • 나만의 글 (0)
      • 제품 리뷰 (9)
    • __Dev__ (9)
      • Release (9)
반응형

인기 글

  • 웹 푸시 알림(Web Push Notification)
    2022.06.13
    웹 푸시 알림(Web Push Notification)
  • [Tomcat] 아파치 톰캣 서버 포트 변경하기
    2018.08.24
    [Tomcat] 아파치 톰캣 서버 포트 변경하기
  • [Node.js] 실시간 채팅 서비스 만들기(5) - 채팅⋯
    2018.05.31
    [Node.js] 실시간 채팅 서비스 만들기(5) - 채팅⋯
  • [C/C++] 콘솔게임 프로그래밍 (1) - 프로젝트 생성⋯
    2017.12.19
    [C/C++] 콘솔게임 프로그래밍 (1) - 프로젝트 생성⋯
  • [Vue 3] Composition API와 템플릿 참조(⋯
    2020.10.02
    [Vue 3] Composition API와 템플릿 참조(⋯

태그

  • vue.js
  • pwa
  • vue-next
  • WWDC
  • vue3
  • 파티클
  • Hello World!
  • Deemo
  • spread syntax
  • Java FX
  • 웹 확장
  • AstroWar
  • javascript
  • Scanner
  • vue
  • java
  • 이펙트
  • 자바 프로젝트
  • Vue 3
  • 프로그레시브 웹 앱
  • WWDC20
  • vuex
  • ES6
  • 전개 구문
  • 자바
  • 출간
  • Composition API
  • self
  • 이클립스
  • composition-api

최근 댓글

  • 어디에서도 이런 친절한 설명은 받을 수 없었습니다. 응용⋯
    미쳤다...
  • 정말 너무 감사합니다 선생님 많은 도움이 되고있습니다 어떻⋯
    김준태
  • 커서 위치이동 함수까지 했는데 컴파일하면 Makefile.⋯
    Qour94
  • iOS의 경우 애플에서 개발하고 있는 webkit 엔진을 ⋯
    이근둥
  • android, IOS에서 된다고 했는데 Notifica⋯
    삽자루부대

최근 글

  • 웹 푸시 알림(Web Push Notification)
    2022.06.13
    웹 푸시 알림(Web Push Notification)
  • 스택(Stack)
    2022.05.26
    스택(Stack)
  • 배열(Array)
    2022.05.25
    배열(Array)
  • C언어로 배우는 자료구조
    2022.05.24
    C언어로 배우는 자료구조
  • [Vue 3] Composition API와 템플릿 참조(⋯
    2020.10.02
    [Vue 3] Composition API와 템플릿 참조(⋯

블로그 메뉴

  • 홈
  • 미디어로그
  • 방명록
hELLO · Designed By 정상우.
이근둥

근둥이의 블로그

[C/C++] 콘솔게임 프로그래밍 (8) - 게임루프
언어 & 프레임워크/C & C++

[C/C++] 콘솔게임 프로그래밍 (8) - 게임루프

2017. 12. 21. 16:49
반응형

안녕하세요



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




[ 목차 ]


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) 게임루프로 진입하여 게임이 진행되겠죠.


한번 실행시켜봅시다.



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


하지만 문제가있습니다.


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



이유는 아래와 같습니다.



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

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



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






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


감사합니다.


반응형
저작자표시 비영리 동일조건
    '언어 & 프레임워크/C & C++' 카테고리의 다른 글
    • [C/C++] 콘솔게임 프로그래밍 (10) - 하단 UI 및 게임중단 기능
    • [C/C++] 콘솔게임 프로그래밍 (9) - 플레이어 이동
    • [C/C++] 콘솔게임 프로그래밍 (7) - 텍스트 색상 변경
    • [C/C++] 콘솔게임 프로그래밍 (6) - 맵 제작 및 출력
    이근둥
    이근둥
    새로운 것을 좋아하는 프론트엔드 개발자 ✨
    댓글쓰기

    티스토리툴바