Here’s a class for fading music in Cocos2dx 2.x using the SimpleAudioEngine. Seems like this should be a basic function of the SimpleAudioEngine itself, but this is pretty easy to use, just run it on any CCNode like any other action:
runAction(MusicFade::create(1.0f, 0.0f, true));
Copy and paste from below, or here’s a zip with the files.
#include "MusicFade.h" #include "SimpleAudioEngine.h" using namespace cocos2d; using namespace CocosDenshion; MusicFade::MusicFade() { m_initialVal = 0; m_targetVal = 0; } MusicFade* MusicFade::create(float duration, float volume, bool pauseOnComplete) { MusicFade *pAction = new MusicFade(); pAction->initWithDuration(duration, volume, pauseOnComplete); pAction->autorelease(); return pAction; } bool MusicFade::initWithDuration(float duration, float volume, bool pauseOnComplete) { if (CCActionInterval::initWithDuration(duration)) { m_targetVal = volume; m_bPauseOnComplete = pauseOnComplete; return true; } return false; } void MusicFade::update(float time) { float vol = m_initialVal + time*(m_targetVal - m_initialVal); SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(vol); } void MusicFade::startWithTarget(CCNode *pTarget) { CCActionInterval::startWithTarget( pTarget ); m_initialVal = SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume(); } void MusicFade::stop(void) { if(m_bPauseOnComplete) SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); CCActionInterval::stop(); }
#ifndef __MusicFade__ #define __MusicFade__ #include "cocos2d.h" class MusicFade : public cocos2d::CCActionInterval { public: MusicFade(); static MusicFade* create(float d, float volume, bool pauseOnComplete = false ); bool initWithDuration(float d, float volume, bool pauseOnComplete ); virtual void startWithTarget(cocos2d::CCNode *pTarget); virtual void update(float time); virtual void stop(void); protected: float m_targetVal; float m_initialVal; bool m_bPauseOnComplete; }; #endif /* defined(__MusicFade__) */