Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541642
  • 博文数量: 102
  • 博客积分: 2146
  • 博客等级: 大尉
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-09 17:32
文章分类

全部博文(102)

文章存档

2015年(14)

2014年(24)

2013年(5)

2012年(30)

2011年(16)

2010年(13)

分类: Windows平台

2015-07-26 22:44:45

UI在游戏中占有很重要的地位,但吸引玩家的除了这些看得到的界面和动画之外,游戏在后台中播放的背景音乐

游戏中打击、动作等音效的配合则会让游戏更受玩家的喜爱。在Cocos2D-X中也为我们封装了一个跨平台的、播放

音频相关的类SimpleAudioEngine,下面就让我们一起来学习这个类。

 

 

一、音乐与音效

 

    由于Cocos2D-X是跨平台的引擎,所以如果大家想通过一套代码多平台通用播放音乐与音效,可以通过Cocos2D-X

定义的宏CC_TARGET_PLATFORM平台变量来区别播放的音频格式。比如,Android只支持ogg的音频格式。

    SimpleAudioEngine的使用比较简单,此类不需要创建,只需要调用其中的播放、暂停、重复播放等与音乐、音效

相关的函数即可。

 

 

二、音乐与音效的相关函数

 

1、音乐相关的函数

 

<1> preloadBackgroundMusic:(NSString *) filePath

作用:预加载背景音乐文件。

参数:音乐文件的相对路经。

 

<2> playBackgroundMusic:(NSString *) filePath loop:(BOOL) loop

作用:播放背景音乐文件。

参数1:音乐文件的相对路经。

参数2:是否重复播放。

 

<3> stopBackgroundMusic()

作用:停止背景音乐。

 

<4> pauseBackgroundMusic()

作用:暂停背景音乐。

 

<5> resumeBackgroundMusic()

作用:继续播放背景音乐。

 

<6> rewindBackgroundMusic()

作用:倒带到音乐刚开始。

 

<7> isBackgroundMusicPlaying()

作用:获取当前背景音乐是否正在播放中。

 

<8> float getBackgroundMusicVolume()

作用:获取当前背景音乐的音量。

返回值:其音量范围[0.0,1.0]。

 

<9> setBackgroundMusicVolume(float volume)

作用:设置当前背景音乐的音量。

返回值:其音量范围[0.0,1.0]。

 

2、音效相关的函数

 

<1> preloadEffect(const char * pszFilePath)

作用:预设加载音效。

参数:音效文件的相对路经。

 

<2> unloadEffect(const char * pszFilePath)

作用:释放音效文件。

参数:音效文件的相对路经。

 

<3> unsigned int preloadEffect(const char * pszFilePath,bool bLoop)

作用:播放音效文件。

参数1:音效文件的相对路经。

参数2:是否重复播放。

返回值:为播放的音效生成ID。

 

<4> stopEffect(unsigned int nSoundId)

作用:停止音效播放。

参数:需要停止音效的ID。

 

<5> pauseEffect(unsigned int nSoundId)

作用:暂停音效播放。

参数:需要暂停音效的ID。

 

<6> resumeEffect(unsigned int nSoundId)

作用:继续音效播放。

参数:需要继续播放音效的ID。

 

<7> float getEffectsVolume(unsigned int nSoundId)

作用:获取音效音量。

参数:音效音量范围[0.0,1.0]。

 

<8> setEffectsVolume(float volume)

作用:设置音效音量。

参数:音效音量范围[0.0,1.0]。

 

 

<9> pauseAllEffects()

作用:暂停所有音效。

 

<10> resumeAllEffects()

作用:继续播放所有音效。

 

<11> stopAllEffects()

作用:停止所有音效。

 

 

三、项目实例

 

1、首先新建Cocos2D-X项目,取名为“MyMusicEffect”,然后在HelloWorldScene.h文件中声明如下成员函数和变量。

  1. class HelloWorld public cocos2d::CCLayer  
  2.  
  3. public 
  4.     // Here's difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone  
  5.     virtual bool init();    
  6.   
  7.     // there's no 'id' in cpp, so we recommand to return the exactly class pointer  
  8.     static cocos2d::CCScene* scene();  
  9.       
  10.    //menuitem回调函数  
  11.     void menuBack(CCObject pSender);  
  12.   
  13.     //用以记录音效ID  
  14.     int effectId  
  15.   
  16.     // implement the "static node()" method manually  
  17.     CREATE_FUNC(HelloWorld);  
  18. };  


2、然后在HelloWorldScene.cpp文件中添加如下所示代码。

  1. #include "HelloWorldScene.h"  
  2. #include "SimpleAudioEngine.h"  
  3.   
  4. using namespace cocos2d;  
  5. using namespace CocosDenshion;  
  6.   
  7. //根据不同平台使用预编译索引不同音频文件  
  8. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  
  9. #define EFFECT_FILE        "effect2.ogg"  
  10. #elif( CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)  
  11. #define EFFECT_FILE        "effect1.raw"  
  12. #else  
  13. #define EFFECT_FILE        "effect1.wav"  
  14. #endif  
  15.   
  16. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)  
  17. #define MUSIC_FILE        "music.mid"  
  18. #elif (CC_TARGET_PLATFORM == CC_PLATFORM_BLACKBERRY)  
  19. #define MUSIC_FILE        "background.ogg"  
  20. #else  
  21. #define MUSIC_FILE        "background.mp3"  
  22. #endif  
  23.   
  24. std::string items[]  
  25.      "play background music" 
  26.         "stop background music" 
  27.         "pause background music" 
  28.         "resume background music" 
  29.         "rewind background music" 
  30.         "is background music playing" 
  31.         "play effect" 
  32.         "play effect repeatly" 
  33.         "stop effect" 
  34.         "unload effect" 
  35.         "add background music volume" 
  36.         "sub background music volume" 
  37.         "add effects volume" 
  38.         "sub effects volume" 
  39.         "pause effect" 
  40.         "resume effect" 
  41.         "pause all effects" 
  42.         "resume all effects" 
  43.         "stop all effects"  
  44. };  
  45.   
  46. CCScene* HelloWorld::scene()  
  47.  
  48.     CCScene scene NULL;  
  49.     do   
  50.      
  51.         // 'scene' is an autorelease object  
  52.         scene CCScene::create();  
  53.         CC_BREAK_IF(! scene);  
  54.   
  55.         // 'layer' is an autorelease object  
  56.         HelloWorld *layer HelloWorld::create();  
  57.         CC_BREAK_IF(! layer);  
  58.   
  59.         // add layer as child to scene  
  60.         scene->addChild(layer);  
  61.     while (0);  
  62.   
  63.     // return the scene  
  64.     return scene;  
  65.  
  66.   
  67. // on "init" you need to initialize your instance  
  68. bool HelloWorld::init()  
  69.  
  70.     bool bRet false 
  71.     do   
  72.      
  73.   
  74.         CC_BREAK_IF(! CCLayer::init());  
  75.   
  76.        CCMenu* m_pItmeMenu CCMenu::create();  
  77.     CCSize CCDirector::sharedDirector()->getWinSize();  
  78.     int m_nTestCount sizeof(items) sizeof(items[0]);  
  79.       
  80.     for (int 0; m_nTestCount; i++){  
  81.         CCLabelTTF* label CCLabelTTF::create(items[i].c_str(), "Arial"15);  
  82.           
  83.         CCMenuItemLabel* pMenuItem CCMenuItemLabel::create(label, thismenu_selector(HelloWorld::menuBack));  
  84.           
  85.         m_pItmeMenu->addChild(pMenuItem, i);  
  86.         pMenuItem->setPosition( CCPointMake(0, (s.height*0.5-20- (i 1) 15) ));  
  87.      
  88.     addChild(m_pItmeMenu,0,100);  
  89.     //预加载音乐和音效  
  90.     SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(MUSIC_FILE);  
  91.     SimpleAudioEngine::sharedEngine()->preloadEffect(EFFECT_FILE);  
  92.     //设置默认音量  
  93.     SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);  
  94.     SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);  
  95.   
  96.         bRet true 
  97.     while (0);  
  98.   
  99.     return bRet;  
  100.  
  101.   
  102. void HelloWorld::menuBack(CCObject pSender){  
  103.     CCMenuItem* pMenuItem (CCMenuItem *)(pSender);  
  104.     int nIdx pMenuItem->getZOrder()  
  105.     switch(nIdx)  
  106.      
  107.         case 0:  
  108.             //播放背景音乐  
  109.             SimpleAudioEngine::sharedEngine()->playBackgroundMusic(MUSIC_FILE true);  
  110.             break 
  111.         case 1:  
  112.             //停止背景音乐  
  113.             SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();  
  114.             break 
  115.         case 2:  
  116.             //暂停背景音乐  
  117.             SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();  
  118.             break 
  119.         case 3:  
  120.             //继续播放背景音乐  
  121.             SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();  
  122.             break 
  123.         case 4:  
  124.             //后退背景音乐  
  125.             SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();  
  126.             break 
  127.         case 5:  
  128.             //背景音乐是否正在播放  
  129.             if (SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying()){  
  130.                 CCLOG("背景音乐正在播放");  
  131.             }else 
  132.                 CCLOG("背景音乐没在播放");  
  133.              
  134.             break 
  135.         case 6:  
  136.             //播放音效,并且得到此音效的ID  
  137.             effectId SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE);  
  138.             break 
  139.         case 7:  
  140.             //重复播放音效  
  141.             effectId SimpleAudioEngine::sharedEngine()->playEffect(EFFECT_FILE, true);  
  142.             break 
  143.         case 8:  
  144.             //停止音效播放  
  145.             SimpleAudioEngine::sharedEngine()->stopEffect(effectId);  
  146.             break 
  147.         case 9:  
  148.             //释放音效  
  149.             SimpleAudioEngine::sharedEngine()->unloadEffect(EFFECT_FILE);  
  150.             break 
  151.         case 10:  
  152.             //增加背景音乐的音量  
  153.             SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() 0.1f);  
  154.             break 
  155.         case 11:  
  156.             //减少背景音乐的音量  
  157.             SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume() 0.1f);  
  158.             break 
  159.         case 12:  
  160.             //增加音效的音量  
  161.             SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() 0.1f);  
  162.             break 
  163.         case 13:  
  164.             //减少音效的音量  
  165.             SimpleAudioEngine::sharedEngine()->setEffectsVolume(SimpleAudioEngine::sharedEngine()->getEffectsVolume() 0.1f);  
  166.             break 
  167.         case 14:  
  168.             //暂停音效  
  169.             SimpleAudioEngine::sharedEngine()->pauseEffect(effectId);  
  170.             break 
  171.         case 15:  
  172.             //继续播放音效  
  173.             SimpleAudioEngine::sharedEngine()->resumeEffect(effectId);  
  174.             break 
  175.         case 16:  
  176.             //暂停所有音效  
  177.             SimpleAudioEngine::sharedEngine()->pauseAllEffects();  
  178.             break 
  179.         case 17:  
  180.             //继续所有音效  
  181.             SimpleAudioEngine::sharedEngine()->resumeAllEffects();  
  182.             break 
  183.         case 18:  
  184.             //停止所有音效  
  185.             SimpleAudioEngine::sharedEngine()->stopAllEffects();  
  186.             break 
  187.      
  188. }  


阅读(646) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~