I have added music to my Game.
I have a infinite song that is looping all time. When game start, or player is killed, must sound IntroPart. And then enter in first part, and second part loop.
To play Music I use:
/**
* \brief Play background music
*
* \param[in] String with musicFile
*/
void SoundManager::
PlayBackgroundMusic(const char * musicFile)
{
if (DataModule::get_instance()->getGameSettings()->getIsMusicEnabled())
{
// Concatenate extension for each platform
char musicFileWithExtension[80];
strcpy(musicFileWithExtension, musicFile);
strcat(musicFileWithExtension,audioExtension);
CCLog("musicFile: %s", musicFileWithExtension);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(musicFileWithExtension)).c_str(), true);
}
}
And to Launch son, from my
class GameplayLayer : public cocos2d::CCLayer, public GameplayLayerDelegate
And preload Audio:
SoundManager::
SoundManager()
{
CCLog("SoundManager Constructor");
// Temporal Preload Audio
char musicFileWithExtension[80];
strcpy(musicFileWithExtension, "MB_NORMAL_0");
strcat(musicFileWithExtension,audioExtension);
CCLog("preload musicFile: %s", musicFileWithExtension);
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(musicFileWithExtension)).c_str());
char musicFileWithExtension2[80];
strcpy(musicFileWithExtension2, "MB_NORMAL_1");
strcat(musicFileWithExtension2,audioExtension);
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(musicFileWithExtension2)).c_str());
char musicFileWithExtension3[80];
strcpy(musicFileWithExtension3, "MB_NORMAL_2");
strcat(musicFileWithExtension3,audioExtension);
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(musicFileWithExtension3)).c_str());
}
And to play in the correct Moment:
/**
* \brief Call to init or resume background music
*
* Must be reset putting _isMusicBackgroundInit if want another intro :D
*/
void GameplayLayer::initMainBackgroundMusic()
{
if (!_isMusicBackgroundInit)
{
CCLog("GameplayLayer::initMainBackgroundMusic _isMusicBackgroundInit: %d", _isMusicBackgroundInit);
// Stop all
SoundManager::get_instance()->StopAllEffects();
SoundManager::get_instance()->StopBackgroundMusic();
//this->stopAction(kMusicIntro);
// Init music
CCAction *actionMove1 = CCCallFuncN::create(this, callfuncN_selector(GameplayLayer::MacroClassicIntro));
CCAction *actionMove2 = CCDelayTime::create(3.63759); // Duration 3.63759
CCAction *actionMove3 = CCCallFuncN::create(this, callfuncN_selector(GameplayLayer::updateMainBackgroundMusic));
// Create Array Actions
CCArray *myActionsArray = new CCArray(3);
// Insert Objects
myActionsArray->insertObject(actionMove1, 0);
myActionsArray->insertObject(actionMove2, 1);
myActionsArray->insertObject(actionMove3, 2);
// Create Sequence
CCAction *actionMove = CCSequence::create(myActionsArray);
// Set Tags
actionMove->setTag(kMusicIntro);
// Run
this->runAction(actionMove);
}
else
{
CCLog("GameplayLayer::initMainBackgroundMusic _isMusicBackgroundInit: %d", _isMusicBackgroundInit);
SoundManager::get_instance()->ResumeBackgroundMusic();
}
}
/**
* \brief Call to updatebackground music
*
*/
void GameplayLayer::updateMainBackgroundMusic()
{
if (!_isMusicBackgroundInit)
{
// Update music
CCAction *actionMove1 = CCCallFuncN::create(this, callfuncN_selector(GameplayLayer::MacroClassicMain1));
CCAction *actionMove2 = CCDelayTime::create(13.4440); // 13.4440
CCAction *actionMove3 = CCCallFuncN::create(this, callfuncN_selector(GameplayLayer::MacroClassicMain2));
CCAction *actionMove4 = CCDelayTime::create(13.6800); // 13.6800
CCAction *actionMove5 = CCCallFuncN::create(this, callfuncN_selector(GameplayLayer::updateMainBackgroundMusic));
// Create Array Actions
CCArray *myActionsArray = new CCArray(5);
// Insert Objects
myActionsArray->insertObject(actionMove1, 0);
myActionsArray->insertObject(actionMove2, 1);
myActionsArray->insertObject(actionMove3, 2);
myActionsArray->insertObject(actionMove4, 3);
myActionsArray->insertObject(actionMove5, 4);
// Create Sequence
CCAction *actionMove = CCSequence::create(myActionsArray);
// Set Tags
actionMove->setTag(kMusicIntro);
// Run
this->runAction(actionMove);
}
else
{
CCLog("GameplayLayer::initMainBackgroundMusic _isMusicBackgroundInit: %d", _isMusicBackgroundInit);
SoundManager::get_instance()->ResumeBackgroundMusic();
}
}
But I feel a little problem between transition. Preloading don’t work. The duration from audio is correct, i used Audacity to cut and test. If I cut the parts and paste in a single audio file, no problem are found. Exist another way to preload, or concatenate audio files to avoid this problem???