게임프로그래밍(C++)

[게임프로그래밍] 아스키 아트와 사운드

susot 2025. 4. 3. 00:00

아스키 아트

아스키 아트란 오로지 텍스트와 특수문만을 조합하여 사진이나 그림을 흉내내는 방식을 말합니다.

 

아스키 아트는 특수문자를 사용하기 때문에 일반적인 출력방법으로는 출력이 불가능합니다.

 

따라서

#include <iostream>
#include <io.h>
#include <fcntl.h>

 

를 include해준 다음 출력모드를 설정해줘야합니다.

 

#include <iostream>
#include <io.h>
#include <fcntl.h>

using namespace std;

int main()
{
	int prevmode = _setmode(_fileno(stdout), _O_U16TEXT);
	wcout <<L"	███████╗██╗   ██╗███████╗ ██████╗ ████████╗" << endl;
	wcout <<L"	██╔════╝██║   ██║██╔════╝██╔═══██╗╚══██╔══╝" << endl;
	wcout <<L"	███████╗██║   ██║███████╗██║   ██║   ██║   " << endl;
	wcout <<L"	╚════██║██║   ██║╚════██║██║   ██║   ██║   " << endl;
	wcout <<L"	███████║╚██████╔╝███████║╚██████╔╝   ██║   " << endl;
	wcout <<L"	╚══════╝ ╚═════╝ ╚══════╝ ╚═════╝    ╚═╝   " << endl;
	int curmode = _setmode(_fileno(stdout), prevmode);
	cout << "안녕하세요" << endl;
}

 

다음처럼 아스키아트를 하기 위해서는 _setmode와 wcout, L을 알아야합니다.

 

 

_setmode는 <io.h> 안에 있는 메소드입니다. _setmode는stdin또는 stdout을 _O_TEXT로 변환하고 int를

반환해줍니다.

 

지금 출력은 일반적인 출력으로는 불가능하기 때문에 _O_U16TEXT로 변환하여 출력을 해줘야합니다.

 

하지만 모드만 바꾸면 출력이 되지 않는데 왜냐하면 cout이 아닌 wcout을 써야하기 때문입니다.

둘에 차이점은

cout : 멀티바이트

wcout : 유니코드

를 출력한다는 차이점이 있습니다.

 

그러면 문자열 앞에 L을 붙이는 이유는 뭘까요?

 

바로 유니코드 문자열을 처리하기 위해서입니다. 유니코드 문자열을 명시적으로 지정하기 위해서는 L이 문자열 앞에 붙어야하기 때문입니다.

 

그러면 다음과 같이 코드를 쓴 이유는 뭘까요?

int prevmode = _setmode(_fileno(stdout), _O_U16TEXT);

int curmode = _setmode(_fileno(stdout), prevmode);

 

앞서 말했듯이 cout은 멀티바이트 wcout은 유니코드를 출력합니다. 따라서 현재 모드가 유니코드를 출력하는

모드이기 때문에, 변수를 선언한것입니다.

 

prevmode에는 변경되기 이전 기본 출력모드가 담기게 되고, 그후 유니코드 출력모드로 바뀌게 됩니다.

그 후 curmode에는 유니코드 출력모드가 담기고, prevmode( = 기본 출력 모드)로 바뀌게 됩니다.

 


 

사운드

 

게임을 제작할때는 출력되는 화면도 중요하지만 그에맞는 사운드도 중요합니다.

 

C++에는 사운드를 출력하는 방법이 2가지 있습니다.

 

바로 Beep과 PlaySound입니다.

 

#include <iostream>
#include <Windows.h>

using namespace std;

int main()
{
	Beep(523.25, 500);
	// 첫번째인자 : 사운드 이름
	// 두번째인자 : 핸들
	// 세번째인자 : 플래그
	PlaySound(TEXT("explosion.wav"), NULL, SND_LOOP | SND_FILENAME);
	Sleep(500);
}

Beep

Beep은 마이크로소프트에서 제작한 함수입니다.

 

 

Beep은 2개의 매개변수를 받습니다

1. 주파수

2. 실행시간(밀리세컨드)

 

이때 주파수는 위 표에 있는 계명의 주파수중 하나를 선택하면 됩니다. 

만약 Beep(523.25, 500); 같은 코드를 썼다면 '도'가 0.5초동안 재생됩니다.

 


 

PlaySound

PlaySound는 사용자가 원하는 사운드를 출력할 수 있는 함수입니다.

하지만 .wav형식에 파일만 재생이 가능하다는 단점이 존재합니다.

 

PlaySound(L"explosion.wav", NULL, SND_LOOP | SND_FILENAME);

PlaySound(TEXT("explosion.wav"), NULL, SND_LOOP | SND_FILENAME);

 

이렇게 오디오 출력방법은 두가지가 존재한다.

아까 설명한것처럼 L이 붙거나 TEXT로 감싸거나 두가지 방법이 존재한데 둘은 똑같이 작동하는 코드입니다.

 

이때 PlaySound F12를 눌러 내부를 보면

 

이렇게 유니코드 버전과 아닌 버전이 있습니다.

이러면 L을 쓸지말지 항상 확인하고 써야하기 때문에 이를 편하게 하 위해서 TEXT를 쓰는것입니다.

 

 

이것처럼 explosion이라는 이름에 wav 파일을 추가해줘야지 소리를 재생할 수 있습니다.

 

두번째 매개변수는 HMODULE인데, 이는 SND_RESOURCE가 지정되지 않은 경우에는 NULL을 씁니다.

 

세번째 매개변수는 사운드 재생을 위한 플래그로

https://learn.microsoft.com/ko-kr/previous-versions//dd743680(v=vs.85)

 

PlaySound function (Windows)

PlaySound function Article 06/06/2016 In this article --> The PlaySound function plays a sound specified by the given file name, resource, or system event. (A system event may be associated with a sound in the registry or in the WIN.INI file.) Syntax BOOL

learn.microsoft.com

이곳에 자세히 설명되어 있으니 필요할때 참고하면 됩니다.

 

오늘은 아스키아트와 사운드재생을 알아보았습니다.