게임 개발/Cocos2d-x

Cocos2d-x 에서 iOS와 안드로이드 배경음악 종류 분리

날개 2014. 3. 27. 17:08

게임을 제작할때 BGM(배경음악)은 거의 필수라고 할 수 있을 것입니다.


모바일 게임을 제작할 때 BGM 파일 포맷을 어떤것을 사용하나요? MP3의 경우 톰슨멀티미디어가 특허 라이선스를 관리하고 있기 때문에 예전에 PC 게임 제작하는 업체들은 MP3대신에 OGG를 많이 사용하였습니다.


특허문제는 나중에 큰 문제가 될 수 있기 때문에 (MP3는 적극적으로 감시하는것으로 압니다) 주의 깊이 사용해야 할 것입니다. (종종 특허나 라이선스, 저작권등에 둔감하신 분들이 계시더군요.)


iOS의 경우는 MP3를 그대로 BGM으로 사용하는 경우도 많은것 같습니다만, 안드로이드의 경우는 PC와 같이 특허를 피하기 위해 OGG를 쓰는것이 안전한것 같습니다.


여튼 특허 라이선스 문제로 들어가면 일이 복잡해 집니다. (예전에 다니던 회사에서도 코덱 라이선스 때문에 여러가지로 번거로웠었죠)


Cocos2d-x의 경우(3.0RC0 기준으로 합니다.) 플랫폼에 따라 음악 파일 포맷을 달리 해 줘야 할 수 있습니다. 안드로이드의 경우 Cocos2d-x에서 CocosDension가 OGG를 지원하지만, iOS에서는 OGG를 지원하지 않기 때문입니다.


정석적인 방법이 있겠지만, 저의 경우는 간단하게 디렉터리를 분리해 보겠습니다.


(맥에서 MP3를 M4A(AAC)로 변환하고 싶으면 아이튠즈를, OGG로 변환하고 싶으면 VLC를 이용하면 간단하게 변환할 수 있습니다.)


아래의 내용은 하나의 예시이므로 적당히 바꾸어서 사용하면 되겠습니다.


1. iOS용 음악 디렉터리 구성


(1) Cocos2d-x로 만든 본인 프로젝트의 디렉터리(이하 MyProj) 중 proj.ios_mac에 ResourcesForApple 이라는 디렉터리를 하나 만듭니다. 


(2) ResourcesForApple 디렉터리 밑에 sounds 디렉터리를 만들고 사용할 음악 파일을 넣습니다. (mp3를 쓰던 m4a를 쓰던 각자 판단에 맡깁니다.)


이렇게 MyProj/Rosources 디렉터리에서 분리를 하는 이유는 안드로이드 빌드시에 해당 음악파일이 포함되지 않게 하기 위해서 입니다.


(3) 새로 만든 ResourcesForApple/sounds 디렉터리를 Xcode 프로젝트에 추가합니다. (저는 Create folder references for any added folders 옵션으로 넣었습니다. 아래 소스는 이렇게 구성한 경우이므로 필요에 따라 적절히 수정하시기 바랍니다.)


2. 안드로이드용 음악 디렉터리 구성


(1) MyProj/Resources 디렉터리에 /ForAndroid/sounds 디렉터리를 만들고, 그 안에 OGG 파일들을 넣습니다.


(2) Xcode 프로젝트에는 포함시키지 않도록 합니다. 


이렇게 함으로써 iOS 빌드시 포함되지 않게 됩니다. MyProj/Resource 밑에 구성하였으므로 안드로이드 빌드시에는 자동으로 포함되게 됩니다.


이제 디렉터리의 구조는 아래와 같이 됩니다.




아래는 Xcode에서 MyProj/proj.ios_mac/ResourcesForApple을 추가한 것입니다.


주의할 점은 아래에 MyProj/Resources/ForAndroid는 절대 포함되면 안된다는 것입니다.




이제 배경음악을 연주하기 위한 코드에서 아래와 같은 방식으로 구분해 줍니다. (아래는 단지 하나의 예입니다.)


void SoundManager::LoadBGM (int kind)

{

#ifdef kEnableSound

  memset (m_currBGMPath, 0, sizeof (m_currBGMPath));

switch (kind) {

        case kBGM_TitleScene:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFOMR == CC_PLATFORM_MAC)

strcpy (m_currBGMPath, "ResourcesForApple/sounds/bgm-title.m4a");

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

strcpy (m_currBGMPath, "forAndroid/sounds/bgm-title.ogg");

#endif

            break;

        case kBGM_GamePlay1:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFOMR == CC_PLATFORM_MAC)

strcpy (m_currBGMPath, "ResourcesForApple/sounds/bgm-play-1.m4a");

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

strcpy (m_currBGMPath, "forAndroid/sounds/bgm-play-1.ogg");

#endif

            break;

        case kBGM_GamePlay2:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFOMR == CC_PLATFORM_MAC)

strcpy (m_currBGMPath, "ResourcesForApple/sounds/bgm-play-2.m4a");

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

strcpy (m_currBGMPath, "forAndroid/sounds/bgm-play-2.ogg");

#endif

            break;

        case kBGM_GamePlay3:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) || (CC_TARGET_PLATFOMR == CC_PLATFORM_MAC)

strcpy (m_currBGMPath, "ResourcesForApple/sounds/bgm-play-3.m4a");

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

strcpy (m_currBGMPath, "forAndroid/sounds/bgm-play-3.ogg");

#endif

            break;

    }

    

    if (strlen (m_currBGMPath) > 0) {

        

CocosDenshion::SimpleAudioEngine::getInstance ()->preloadBackgroundMusic (m_currBGMPath);

CCLOG ("SoundManager::LoadBGM () / [%s]", m_currBGMPath);

    }

#endif

}



사실 간단한 방법입니다만, 가끔 궁금해 하시는 분들이 있어서 포스팅 남깁니다.


참고로 아래는 빌드된 안드로이드용 apk 파일을 열어본 것입니다.




사운드 파일 뿐 아니라, 다른 리소스도 이런식으로 간단한 디렉터리 조작으로 iOS와 안드로이드용을 분리할 수 있습니다.



끝.