【cocos2d-x IOS游戏开发-捕鱼达人19】音乐与音效的实现

标签: cocos2d-x捕鱼达人音乐跨平台
2520人阅读 评论(4) 收藏 举报
分类:

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/17163607


上节回顾

【cocos2d-x IOS游戏开发-捕鱼达人18】积分板实现


1、cocos2d-x中的声音支持

CocosDenshion
整个库完全依赖于OpenAL来实现。关于OpenAL,它不是Khronos Group的标准,而是Creative公司的一个开源库,可以软实现或硬件实现。目前硬件实现了OpenAL的好像就只有苹果的产品,因此在其他平台上,我们无法提供cocosDenshion底层的支持,但我们是支持顶层的,它是开发者最常用到的一层。

SimpleAudioEngine
Cocos2d-x已封装了SimpleAudioEngine用来跨平台。在我们的游戏中,我可以仅用一行代码,就能播放背景音乐和音效。

相关函数
playBackgroundMusic
stopBackgroundMusic
playEffect
stopAllEffects


2、游戏中的音效

相关的音效
大炮切换
炮弹发射
每种鱼死亡的音效
背景音乐

音效控制
开关


3、cocos2d-x中的声音格式调用

在大多数平台上,cocos2d-x调用不同的SDK API来播放背景音乐和音效。

CocosDenshion在同一时间只能播放一首背景音乐,但是能同时播放许多音效。

背景音乐

平台 

支持的BGM格式

Android 在android上CocosDenshion能支持的音频格式是对应于android.media.MediaPlayer所支持的格式。
iOS 在IOS上面Cocos2d-x的CocosDenshion所支持的格式和Cocos2d-iphone中所支持的是一样,mp3,caf是推荐的格式。
windows .mid, .wav, .mp3 are supported.
Marmalade mp3


音效

警告:Samsung i9100 似乎在音频驱动上面有一个bug。它不能同时播放太多音效。所以当你在Samsung i9100中运行你的程序的时候,最好不要调用SimpleAudioEngine::playEffect(const char*filePah)太过频繁。

平台  

支持的音效格式

Android ogg是最好的选择,对wav的支持不是太好
iOS IOS  和cocos2d-iphone中cocosDenshion所支持的格式一样。个人建议是苹果的caf格式
windows * .mid, .wav.
Marmalade 只支持原生 PCM格式(参照 http://www.madewithmarmalade.com/devnet/forum/5459)


本游戏中音乐的具体的实现请看代码:

音乐控制:

void CGameLogic::onShoot(float x,float y,float dir )
		{
			int cost = config::CBulletConfig::getData(m_iLevel)->Cost;
			if(m_iTotalMark < cost){
				playEffect("NoBullet.wav",false);
				return;
			}

			const char *pEffect = NULL;
			switch(m_iLevel)
			{
			case 1:
				pEffect = "Silo1.wav";
				break;
			case 2:
				pEffect = "Silo2.wav";
				break;
			case 3:
				pEffect = "Silo3.wav";
				break;
			case 4:
				pEffect = "Silo4.wav";
				break;
			case 5:
				pEffect = "Silo5.wav";
				break;
			default:
				return;

			}
			playEffect(pEffect,false);

			addMark(-cost);

			scene::ISceneObject* pS = m_pGameScene->createObject(1005);
			CBulletObject* pObj = new CBulletObject(pS,this,m_iLevel);
			pObj->setPosition(x,y);
			pObj->setDuration(dir);
			m_vecBulletsList.push_back(pObj);
		}

		void CGameLogic::openSound( bool b )
		{
			m_SoundOpen = b;
			if(m_SoundOpen == true){
				playMusic(config::CGameConfig::getBgMusic());
			}
			else{
				SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
				SimpleAudioEngine::sharedEngine()->stopAllEffects();
			}
		}

		void CGameLogic::playMusic( const char* file,bool bLoop /*= true*/ )
		{
			if(m_SoundOpen==false)
				return;

			char buf[256];
			sprintf(buf,"audio/%s",file);

			std::string pFullName = buf; 
			pFullName = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename(pFullName.c_str());		

			SimpleAudioEngine::sharedEngine()->playBackgroundMusic(pFullName.c_str(),bLoop);
			//SimpleAudioEngine::sharedEngine()->playBackgroundMusic(pFullName,bLoop);
		}

		int CGameLogic::playEffect( const char* file,bool bLoop /*= false*/ )
		{
			if(m_SoundOpen==false)
				return -1;
			char buf[256];
			sprintf(buf,"audio/%s",file);

			std::string pFullName = buf; 
			pFullName = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename(pFullName.c_str());	
			return SimpleAudioEngine::sharedEngine()->playEffect(pFullName.c_str(),bLoop);
		}

		void CGameLogic::stopEffect( int h /*= -1*/ )
		{
			if(h==-1){
				SimpleAudioEngine::sharedEngine()->stopAllEffects();
			}
			else{
				SimpleAudioEngine::sharedEngine()->stopEffect(h);
			}
		}

	}

本节源代码与工程文件:【资源引用页】

大家可以继续实现音乐的开关界面效果。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:435361次
    • 积分:6494
    • 等级:
    • 排名:第3679名
    • 原创:188篇
    • 转载:3篇
    • 译文:1篇
    • 评论:187条
    博客公告
    博客专栏