본문 바로가기
[ C언어 ]/- C언어 문법공부

C언어 21장(c언어 게임만들기_1, 응용 함수, HANDLE, mmsystem, Windows,h, PlaySound, system함수)

by MRG 2020. 5. 26.
728x90
반응형
728x90

▣ 안녕하세요^^
저번장에 숙제해보셨나요??
네 모두 다 해보셨을 거라 생각하고
오늘은 간단한 게임 만들기 첫 번째 장을 진행해보겠습니다.
간단한 게임이지만
가능한 쉽게 만들려고 노력했습니다.
하지만 많은 코딩들이 들어가 어려울 수 있으니 천천히 따라와 주세요.



▣ 그리고 제가 만든 게임은 여러분들이 만들 코딩에 
하나에 방법일 뿐이지 
정답이 아닙니다.
이걸 함께 공부하고 여러분들만에 게임을 만들어보세요.
코딩은 정답이 없습니다.
저는 그렇게 생각합니다.

▣ 이렇게 함수를 하나 만들어서 
printf로 문 모양을 출력해보겠습니다. 
모양은 여러분들이 원하시는 기호 아무거나 하셔두됩니다. 
그리고 main함수를 통해 우리가 만든 사용자 함수를 호출해주세요.
당연히 선언하는 거 잊지 마시고요.
그럼 문 모양이 나오죠?
함수를 잘 모르시겠다면 꼭 앞에 함수장을 공부하고 와주세요.

 

▣ 이번에는 콘솔 창 크기를 변경해보겠습니다. 
system이라는 함수를 사용할 건데요
이 함수는 쉽게 이야기해서 
시스템 소프트웨어를 제어 기능을 접근할 수 있게 해주는 함수라고 생각하시면 됩니다.
system함수에 값을
mode con을 하게 되면 콘솔을 제어하게 된다라고 생각해주세요.
cols는 가로, lines는 세로에 크기를 지정할 수 있습니다.
큰따옴표 잊지 마세요.
그리고 디버깅을 해보면 이렇게 콘솔 창이 수정된 걸 알 수 있습니다.



▣ 자 직접 자신에 화면에 크기에 맞게 가로, 세로를 설정해서 만들어주세요.

 

▣ system함수에 또 한 가지 기능을 사용해보겠습니다.
"cls"라고 값을 주고 디버깅을 해보면
콘솔 창에 있는 출력한 모든 기호들이 지워진 걸 볼 수 있습니다.
cls는 출력 창에 있는걸 다 지운다라고 보시면 됩니다. 
그럼 많은 용도로 쓸 수 있겠죠?


▣ 이것도 직접 printf를 한 후에 cls로 출력 화면을 지워보세요.
프로그램은 순차적으로 작동한다는 거 기억해주시고, 
그 순서에 맞게 코딩해주세요.

 

▣ 자 이번에는 게임 신을 하나 더 만들어보겠습니다.
게임 신 첫 번째는 멀리서 보이는 작은 문을 그렸고요.
두 번째 게임 씬에서는 가까이서 크게 보이는 문을 그렸습니다. 
그리고 각각 게임 씬이 호출이 되면 전에 출력했던
모든 출력 값은 지우고 그다음에 
콘솔 창에 크기를 정해주고 
문이 나오게 되는 코딩으로 만들어주었습니다.

 

 

▣ 당연히 이런 식으로 순차적으로 프로그램이 하나하나 해석되고 작동되겠죠?
이점 기억해주시면서 게임 씬 두 개에 함수를 만들어주세요.

 

▣ 그다음에는 키를 누르면 게임 씬 1에서 게임 씬 2로 
바뀌는 코드를 작성해보겠습니다.
그러기 위해서 우리가 입출력장에서 배웠던
_getch를 사용하겠습니다.
scanf_s, getchar를 사용해도 되지만,
버퍼를 거치지 않고 바로바로 작동하게 하기 위해서 사용했습니다.
이걸 사용하려면 conio.h를 포함해주고 
사용해야 합니다. 
이 부분은 모르시는 분은 입출력 2번째 장을 공부해주세요.


▣ 다음에 게임 씬 1에서 만약 w키를 누르면 다음 씬으로 이동하게 코딩을 했습니다.
제가 w를 대문자와 소문자 두 가지 다 조건을 주었습니다. 
이건 여러분들이 아무 키나 정하셔도 됩니다.
그리고 디버깅을 해보면 처음 작은 문이 나오고 w를 누르면 앞으로 전진한다라는 의미로
큰 문이 나오게 됩니다. 
아주 신기하죠 ^^
이렇게 간단한 방법으로도 이런 출력이 가능합니다. 


▣ 문이 아니어도 되니깐 직접 다르게 만들어보세요.

 

▣ 이번에는 Beep라는 함수를 통해서 
소리를 내 보겠습니다.
처음 값은 음높이, 그리고 음에 지속시간을 지정해주고, 
출력을 해보면 도 음이 나오는 걸 볼 수 있습니다. 
이렇게 직접 게임 씬 1에서 문이 나오면서 도움이 나오게 만들어주세요.

 

▣ 도레미파솔라시도 음은 이렇게 설정하시면 됩니다.
이것도 하나하나 소리를 확인해주세요.

 

▣ 소리를 설정하셨다면 게임 씬 3을 만들어서 열려있는 문을 만들어주세요.
그런 다음에 소리까지 추가해주세요.

 

▣ 그리고 함수를 선언 및 정의를 꼭 해주시고, 
조건문에서 게임 씬 2가 호출되고 또 w를 누르면 문이 열리고 소리가 나오게 코딩을 해줍니다.
그럼 우리가 문에 가까이 가서 문을 열고 들어간다라는 느낌을 주게 되죠??
꼭 중첩 if문을 사용하지 않고 다르게 하셔도 됩니다.


▣ 여끼 가지 저처럼 하셔도 되고, 
아니면 다르게 NPC를 만나거나, 아이템을 먹으러 간다 라는 상황 등등을 
만들어보실 수 있겠죠??
1인칭 게임이라고 생각합시다 ^^


▣ 자 이번에는 Windows.h를 include를 하고 HANDLE을 사용해보겠습니다. 
핸들은 무엇이냐면
우리가 시스템 소프트웨어(운영체제 == os == 커널)에서 응용프로그램을 사용하려면
컴퓨터한테 그걸 사용할 권한을 얻어야 합니다. 
왜냐하면 컴퓨터에 모든 부분을 관리하고 있기 때문입니다.
만약 시스템 소프트웨어가 없으면 우리는 모든 소프트웨어를 하나하나 관리를 해야 할 겁니다. 
그렇기 때문에 운영체제라는 것을 만들고 관리하게 했죠.
그래서 우리 유저가 응용프로그램을 사용하려면 
권한을 얻어야 하는데 그 권한을 얻어서 사용하기 위해서는 
그 응용프로그램에 주소가 필요합니다. 


▣ 왜 그럴까요?
우리가 메모리를 공부하면서도 이야기했지만,
모든 메모리에는 주소로 관리가 되기 때문입니다.
그런데 여기서 문제가 생깁니다.
시스템 소프트웨어가 우리한테 그냥 주소를 주고 
권한을 다 준다면 어떻게 될까요?
자유롭게 사용은 할 수 있지만, 
그걸 나쁜의 도로 사용한다면 범죄와 보안에 큰 위험이 될 겁니다.
그래서 주소를 직접 주는 게 아닌,
핸들 값이라는 게 있습니다.
그 핸들 값을 주는 거죠.
우리 유저가 요청을 하면 주소가 아닌 핸들 값을 주어서
우리는 사용할 수 있게 되고 주소 값을 주지 않기 때문에
보안상에도 문제가 되지 않습니다.


▣ 제가 왜 이런 어려운 설명을 했을까요?
우리가 지금부터 핸들이라는 함수를 통해 운용체제에 기능을 사용할 거기 때문입니다.

 

▣ HANDLE를 선언하고 handle이라는 변수로 정의해주었습니다.
우리가 구조체를 만들고 선언과 정의할 때 이렇게 했죠?
그것과 동일합니다.
그 안에 우리가 출력하는 HANDLE값을 넣어줍니다.
COORD는 포지션을 지정해주는데 이건 구조체라고 보시면 되고요.
오른쪽 마우스를 눌러 정의를 보면 struct라는 걸 확인할 수 있습니다.
그리고 각각 COORD에 x, y값 안에 함수에서 받아온 
매개변수를 대입해줍니다.
그리고 Set콘솔에서 커서에 포지션을 지정해주는데, 
처음 값은 출력 핸들 값과 그 포지션 값을 넣어줍니다. 

 

▣ 처음에 HANDLE를 추가하지 않고 이렇게 직접 값을 넣으셔도 됩니다.
그럼 이제 이 함수를 호출해서 사용해볼까요?

 

▣ 게임 1 씬에서 콘솔 창 크기를 좀 키워주고,
gotoXY함수에 매개변수에 값을 지정한 다음에,
위치입니다를 출력합니다. 
그럼 문을 출력하고 우리가 지정한 위치로 커서가 이동한 다음에
위치입니다를 출력하게 됩니다. 

 

▣ 자 여기서 중요한 건 X Y에 기준이 우리가 수학 시간에 배웠던 것처럼 
가운데가 0 0 값이 아닙니다. 
왼쪽 상단 맨 위에 값이 0, 0입니다. 
그걸 기준으로 X는 오른쪽으로 갈수록 +가 되고
Y값은 밑으로 갈수록 +가 됩니다. 


▣ 이점 기억해주시고,
직접 다른 위치로 커서를 이동하게 출력해보세요.

 

▣ 자 이번에는 문을 완성했으니,
플레이어가 움직이는 키에 정보와 현재 위치에 정보를 보여주는
정보 함수를 만들어보겠습니다.
함수 이름은 GameInfo입니다. Information 약자입니다.
그리고 함수 안에서 mapNumber변수는 현재 위치를 받아올 변수입니다. 
그리고 오른쪽에 정보가 하나하나 출력되기 위해서 
이렇게 하나하나 X, Y에 값을 지정해주었습니다. 

 

▣ 그리고 함수를 사용하기 위해서 
꼭 위에 선언을 해주시고요.

 

▣ 이렇게 씬이 바뀔 때마다 출력하게 하기 위해서 처음에 게임 씬 함수마다 mapNumber를 선언 및 정의를 해주시고 마지막에 게임에 정보가 나오게 합니다.
그럼 이렇게 오른쪽에 게임 정보 함수에서 만들었던 값들이 
출력된 걸 볼 수 있습니다.


▣ 게임 씬 함수마다 이렇게 코딩을 해두면 정보가 바뀌겠죠?
그리고 int mapNumber은 스택 메모리에 사용하는 지역변수이기 때문에,
함수가 끝나면 사라지게 됩니다. 
서로 함수마다 영향을 주지 않겠죠?

 

▣ 이번에는 아까 조건문을 수정해보겠습니다. 
키를 누르는 부분은 따로 OR로 지정을 해주고,
mapNumber로 현재 위치를 구분해서 첫 번째 문이면 두 번째문만 갈 수 있고,
두 번째 문일때 s키 뒤로 눌러야 첫번째 문을 갈 수 있습니다.
그리고 두번째 문일 때만 w키 앞으로 눌러야 게임 씬 3문을 가게 됩니다.
이렇게 조건을 하나하나 생각해보시면서 
코딩을 진행해주세요.
저건 제가 쉽게 그냥 예시로 만든 겁니다. 


▣ 여러분들이 더 좋은 다른 방법이 있다면 그걸 사용하시면 됩니다. 
자 이렇게 코딩을 마쳤습니다.
우리가 앞뒤 문으로 다가가고 문을 열고 하는 상황을 만들게 되었습니다. 
하지만 도레미가 나오면서 문이 나오는 건 조금 이상합니다.
이번에는 소리를 넣는 걸 해보겠습니다. 



▣ 소리는 이곳에서 다운로드하시면 되는데요.

https://freesound.org/

 

▣ 여기서 로그인을 하시면 0으로 표시되어 있는 걸 받으셔서 
사용하시면 되는데 0으로 표시된 건 산업용으로도 사용이 가능하다는 점 
참고하시고 다운로드하여주세요.


▣ 그런데 우리가 c언어에서 코딩으로 소리를 내려면 
소리 확장자가 wav 이여야 합니다.
확장자를 바꿔주는 기능이 있는 홈페이지도 있습니다.

 

https://www.media.io/

 

Online UniConverter (Media.io) - Free Online File Converter, Editor, Compressor

Online UniConverter (Media.io) — Free online tools with free video converter & audio converter convert files online free, it can compress video/audio/image files to save space, and edit videos easily.

www.media.io

▣ 여기입니다. 

▣ 우리가 변환할 소리파일을 넣고 
이렇게 오디오에서 wav로 선택한 다음에

 

▣ 변환을 누르면 이렇게 작업이 진행됩니다. 

 

▣ 완료되면 다운로드 창으로 바뀌는데 
다운로드하시면 아까 넣었던 소리파일이 wav형식으로 바뀐 걸 확인할 수 있습니다. 
꼭 직접 원하는 소리를 가져올 때 이런 과정으로 진행해주세요.

 

 

▣ 자 우선 c언어에서 소리파일을 출력하려면
이렇게 mmsystem.h를 가져와야 합니다.
이건 윈도 멀티미디어 시스템을 사용하기 위한 헤더 파일이고
그 밑에는 그걸 재생할 윈도 미디어 프로그램을 사용한다라고 생각하시면 됩니다.
단 wav 파일만 가능합니다. 
다른 확장자도 다른 방법이 있다고는 하는데
그건 제가 다음에 알아보겠습니다. 

 

 

▣ 먼저 게임 씬에 제가 Walk는 소리를 다운로드하여서  C드라이브에 넣었습니다. 
이건 제가 나중에 경로를 지정하기 쉽게 하기 위해서 여기에 두었습니다.
그리고 저는 배경음악, 문 여는 소리, 걷는 소리를 가져왔습니다.
여러분들도 여러분이 원하는 소리를 다운로드하여주세요.

 

▣ 그런 다음에 이렇게 게임 씬 1 함수가 출력되면 
소리가 나오게 하겠습니다. 
PlaySound함수를 사용하시면 되는데요 
처음에는 파일 경로를 지정해줍니다.
여기서 주의할 건 C드라이브는 대문자로 적어야 하는 것입니다. 


▣ 그런 다음에 NULL값을 넣어줍니다. 
그리고 SND_ASYNC를 넣는데 한번 재생하는 걸 의미합니다.
그리고 소리를 내면서 다음 코딩도 계속 진행하는 걸 의미하기도 합니다. 
이렇게 해서 코딩을 완료하고 디버깅을 해서 소리를 재생해보세요.
안되시는 분들은 꼭 경로 확인해주세요.


▣ 만약에 경로는 적지 않고 파일 이름만 적어서 재생하게 하려면
우리가 만든 설루션 프로젝트 파일에 소리파일을 넣어주시면 됩니다.

 

▣ 이렇게 소리 함수 안을 들어가 보면
이렇게 어떤 기능들인지를 알 수 있는 코딩을 볼 수 있습니다.
필요한 기능이 있으시면 꼭 한 번씩 확인해보고 사용해보세요.

 

 

▣ 그리고 저는 게임 씬 3으로 넘어갈 때 문을 여는 소리를 넣었습니다.
이것도 여러분들이 원하시는 소리로 지정해서 코딩해보세요.

 

 

▣ 마지막으로 시작 메뉴를 만들어보았습니다.
게임 시작 메뉴는 음악이 나오게 합니다. 
그리고 타이틀 이름이 나오고 a 키를 누르면 게임이 시작된다라는 문구가 나옵니다. 
그런데 여기서 주의해야 할 건
c언어에서 소리는 동시에 한꺼번에 여러 개에 소리를 낼 수 없고 
딱 한 가지 소리만 재생할 수 있습니다.
소리를 무한으로 재생하더라도 
다음 소리가 실행되면 
현재 소리가 끊기고 
다음 소리를 재생합니다. 
그러니 이점 꼭 기억해주시고 코딩해주세요.
소리는 하나만 재생할 수 있습니다.

 


▣이렇게 a 키를 누르면 함수가 끝나고 게임 씬 1로 넘어가는 코딩을 만들었습니다. 
이렇게 해서 디버깅을 해보면

 

▣ 웅장한 음악이 무한으로 재생되면서 a 키를 눌러주세요라고 나오게 됩니다.
이 디자인은 여러분들이 원하는 시는 디자인으로 만들어주세요. 


▣ 자 오늘은 게임 만들기 첫 번째 장을 진행했습니다.
정말 많은 걸 배웠네요.
조금 어려우실 수도 있지만,
그래도 정말 쉽게 만들기 위해서 코딩을 많이 늘렸습니다.
그러니 이 방법은 정답이라고 생각하지 마시고,
우리가 저 위에서 사용하지 않은 배열, 포인터, 메모리를 사용해서 
만드셔도 됩니다.
코딩은 정답이 없습니다.
잊지 마세요.
다음장에서도 이어서 게임을 만들어보겠습니다. 
꼭 하나하나 해보시기 바랍니다.
질문 있으시면 댓글 남겨주세요.
그럼 다음장에서 뵙겠습니다.


▣ 포기하지 마세요!! 저도 했습니다!!! 파이팅!!!

728x90
반응형

댓글