위 스타팅 프로젝트 파일에는 에셋폴더에 jump.wav라는 효과음이 첨부되어 있다. 이를 이용할 것이다.
main.cpp에서 게임창을 초기화하였으므로 바로 이어서 오디오도 초기화하자
main.cpp에서 게임창을 만든 직후에 오디오를 초기화하자
// 게임창 만들기 SetTargetFPS(60); // Set our game to run at 60 frames-per-second InitWindow(screenWidth, screenHeight, "Flappy Bird"); // 오디오 디바이스 초기화하기 InitAudioDevice(); // Initialize audio device
CloseWindow() 바로 전에 오디오를 닫는 함수를 부르자. while문이 종료된 다음에 불러와야 할 것이다.
CloseAudioDevice(); // Close audio device CloseWindow(); // Close window and OpenGL context return 0;
bird.h에 다음과 같이 점프에 사용할 사운드를 선언한다.
Sound fxJump; // Load WAV audio file
bird.cpp에서 Init문에서 사용할 wave파일을 할당하면 된다/
void Bird::Init() { // 최초의 포지션 정하기 pos = {150, float(GetScreenHeight()) / 2} ; // 그림으로 넣기 birdImage = LoadTexture("Assets/birddrawing.png"); // Texture loading fxJump = LoadSound("Assets/jump.wav"); }
끝나면 사운드 파일을 메모리에서 해제하는 것을 잊지 말자
Bird::~Bird() { UnloadTexture(birdImage); // Texture unloading UnloadSound(fxJump); // Unload sound data }
PlaySound()함수를 사용하면 된다. 쉽다.
void Bird::Jump() { downSpeed = -jumpSpeed; PlaySound(fxJump); // Play WAV sound }
이제 이것을 활용하여 플레이어가 장애물에 부딪히면 다치는 사운드도 만들어 보자.
그런데 Assets폴더에는 mp3로 되어 있다. 이것은 ConvertIO와 같은 변환사이트에서 변환하면 된다.
변환한 후에 해당 wav파일을 위와 똑같이 PlaySound()함수로 활용하면 된다.
이런 식으로 나머지 효과음도 집어 넣자. 나는 이렇게 코딩했다.
// 플레이어가 데미지를 입는 메서드 void Bird::Hurt() { Life--; SetInvincible(true); if (Life > 0) PlaySound(fxHurt); else PlaySound(fxExplosion); }
game.h에 음악파일을 선언한다.
Music music;
game.cpp에서 Init()함수 내에 다음과 같이 음악을 할당한다.
// 배경음악 플레이 할당하기 music = LoadMusicStream("Assets/country.mp3"); PlayMusicStream(music);
다음을 항상 잊지 말자
Game::~Game() { UnloadTexture(backgroundImage); UnloadMusicStream(music); // Unload music stream buffers from RAM pipes.clear(); }
Update()루프에서 Switch 문 위에 다음과 같이 뮤직 스트림을 업데이트 하는 함수를 실행한다.
이래야만 음악이 연주된다.
// Update UpdateMusicStream(music); // Update music buffer with new stream data
ResumeMusicStream() 함수와 PauseMusicStream() 함수를 이용하면 된다.
case Gamestate::pause : // 정지로직 if (IsKeyPressed(KEY_UP)) { gamestate = Gamestate::game; // 게임으로 돌아가기 ResumeMusicStream(music); } if (gamestate == Gamestate::pause && IsKeyPressed(KEY_ESCAPE) ) Manager->gameExit = true; // 정지상태일때, ESC 누르면 종료 break;
다음과 같이 ESC키를 누르면 일시정지 함수를 불러오면 된다.
case Gamestate::game : // 게임로직 // 키보드 입력 if (IsKeyPressed(KEY_ESCAPE)) { gamestate = Gamestate::pause; // 게임정지로 바꾸기 PauseMusicStream(music); }