게임에서 사운드는 꼭 필요한 요소입니다. 아무리 재미있는게임이라도 소리끄고 하면 재미가 반감되는건 해본 사람만 아는 사실이겠지용? Cocos2x로 게임이나 앱을 개발할때 사운드는 어떻게 구현하시나요? 저는 싱글턴 클래스(Singleton Class)로 만들어서 프로그램 코드 작성할때 언제 어디서건 불로 올 수 있도록 구현해서 사용한답니다.


싱글턴 클래스란 다들 아시죠? 단 하나의 인스턴스만 존재하게 만든 클래스인거, 자세한 내용을 알고 싶으시다면 검색창에서 '싱글턴 클래스' 혹은 'Singleton class'라고 검색하면 수많은 글들이 나올꺼에요. 그중에서 가장 쉽게 된거 찾아서 읽어보시면 되어요.


자 제가 사용해본 사운드 싱글턴 클래스입니다.


SoundMngt.h 파일


#pragma once


using namespace std;


//-----------------------------------------------------------------------------

// Type   : SoundMngt

// Author : RYU

// Role   : Managing sound effect here

//-----------------------------------------------------------------------------

class SoundMngt

{

public:

SoundMngt();

~SoundMngt();


// Singleton object

static SoundMngt& getInstance();

static void releaseInstance();

static SoundMngt* m_pInstance;


// attributes

public:

void PlayBGM();

void PlayClick();

void PlayHit();

void PlayIntro();


void StopBGM();

void StopEffect();


private:

static bool _isBGMPlaying;


};




SoungMngt.cpp 파일


/**

* full review  14:04:21 RYU : initial version

*/


//---------------------------------------------------------------------EWST API

#include "SoundMngt.h"

#include "Common.h"


//---------------------------------------------------------------- cocos2dx API

#include "audio\include\SimpleAudioEngine.h"

using namespace CocosDenshion;


SoundMngt *SoundMngt::m_pInstance = nullptr;

bool SoundMngt::_isBGMPlaying = false;


//-----------------------------------------------------------------------------

//Constructor : SoundMngt

//-----------------------------------------------------------------------------

SoundMngt::SoundMngt()

{

SimpleAudioEngine::getInstance()->preloadEffect("sound/click.mp3");

SimpleAudioEngine::getInstance()->preloadEffect("sound/intro.mp3");

SimpleAudioEngine::getInstance()->preloadEffect("sound/hit.mp3");


SimpleAudioEngine::getInstance()->preloadBackgroundMusic("sound/bgm.mp3");

SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(0.05f);

SimpleAudioEngine::getInstance()->setEffectsVolume(0.7f);

_isBGMPlaying = false;

}


//-----------------------------------------------------------------------------

//Destructor : ~SoundMngt

//-----------------------------------------------------------------------------

SoundMngt::~SoundMngt()

{

}


//-----------------------------------------------------------------------------

// getInstance

//-----------------------------------------------------------------------------

SoundMngt& SoundMngt::getInstance()

{

if (m_pInstance == nullptr)

m_pInstance = new SoundMngt();


return *m_pInstance;

}


//-----------------------------------------------------------------------------

// releaseInstance

//-----------------------------------------------------------------------------

void SoundMngt::releaseInstance()

{

if (m_pInstance != nullptr)

delete m_pInstance;

}



//-----------------------------------------------------------------------------

// PlayBGM

//-----------------------------------------------------------------------------

void SoundMngt::PlayBGM()

{

if (_gBGMOn == 1)

{

if (_isBGMPlaying == false)

{

SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/bgm.mp3", true);

_isBGMPlaying = true;

}

}

else 

{

StopBGM();

}

}


//-----------------------------------------------------------------------------

// PlayHit

//-----------------------------------------------------------------------------

void SoundMngt::PlayHit()

{

if (_gEffectOn == 1)

SimpleAudioEngine::getInstance()->playEffect("sound/hit.mp3");

}


//-----------------------------------------------------------------------------

// PlayClick

//-----------------------------------------------------------------------------

void SoundMngt::PlayClick()

{

if (_gEffectOn == 1)

SimpleAudioEngine::getInstance()->playEffect("sound/click.mp3");

}


//-----------------------------------------------------------------------------

// PlayIntro

//-----------------------------------------------------------------------------

void SoundMngt::PlayIntro()

{

if (_gEffectOn == 1)

SimpleAudioEngine::getInstance()->playEffect("sound/intro.mp3");

}


//-----------------------------------------------------------------------------

// StopBGM

//-----------------------------------------------------------------------------

void SoundMngt::StopBGM()

{

SimpleAudioEngine::getInstance()->stopBackgroundMusic();

_isBGMPlaying = false;

}


//-----------------------------------------------------------------------------

// StopEffect

//-----------------------------------------------------------------------------

void SoundMngt::StopEffect()

{

SimpleAudioEngine::getInstance()->stopAllEffects();

}



물론 규모가 큰 프로젝트에서는 이렇게 사용안하겠지만, 제가 이 클래스를 사용한 게임은 코드가 1000줄 내외 였던지라, 대충 만들어서 사용했답니다.