• Cocos2d-x中播放背景音乐


    背景音乐的播放与停止实例代码如下:

    [html] view plaincopy
     
    1. SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true);  
    2. SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3");  



    背景音乐的播放代码放置到什么地方比较适合呢?例如:在Setting场景中,主要代码如下:

    [html] view plaincopy
     
    1. bool Setting::init()  
    2. {  
    3.     //播放代码                                                              ①  
    4.     return true;  
    5. }  
    6.   
    7.   
    8. void Setting::onEnter()  
    9. {  
    10.     Layer::onEnter();  
    11.     log("Setting onEnter");  
    12.     //播放代码                                                              ②  
    13. }  
    14.   
    15.   
    16. void Setting::onEnterTransitionDidFinish()  
    17. {  
    18.     Layer::onEnterTransitionDidFinish();  
    19.     log("Setting onEnterTransitionDidFinish");    
    20.     //播放代码                                                              ③  
    21. }  
    22.   
    23.   
    24. void Setting::onExit()  
    25. {  
    26.     Layer::onExit();  
    27.     log("Setting onExit");                                            
    28. }  
    29.   
    30.   
    31. void Setting::onExitTransitionDidStart()  
    32. {  
    33.     Layer::onExitTransitionDidStart();  
    34.     log("Setting onExitTransitionDidStart");                                  
    35. }  
    36.   
    37.   
    38. void Setting::cleanup()  
    39. {  
    40.     Layer::cleanup();                                                         
    41.     log("Setting cleanup");  
    42. }  




    关于播放背景音乐,理论上我们是可以将播放代码SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Synth.mp3",true)放置到三个位置(代码中的①、②、③)。下面我们分别分析一下它们还有什么不同。
    1、代码放到第①行
    代码放到第①行(即在Setting::init函数),如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐。但是如果前面场景层HelloWorld::onExit函数有调用背景音乐停止语句,那么会出现背景音乐播放几秒钟后停止。

    为了解释这个现象,我们可以参考一下6.3.2一节多场景切换生命周期。使用pushScene函数从实现HelloWorld场景进入Setting场景,生命周期函数调用顺序如下图所示。

     
    从图中可见,HelloWorld::onExit调用是在Setting::init之后,这样当我们在Setting::init中开始播放背景音乐后,过一会调用HelloWorld::onExit停止背景音乐播放,这样问题就出现了。
    注意 无论播放和停止的是否是同一个文件,都会出现个问题。


    2、代码放到第②行
    代码放到第②行(即在Setting::onExit函数),如果前面场景中没有调用背景音乐停止语句,则可以正常播放背景音乐。如果前面的场景层HelloWorld::onExit函数有背景音乐停止语句,也会出现背景音乐播放几秒钟后停止。原因与代码放到第①行情况一样。


    3、代码放到第③行
    我们推荐代码放到第③行代码位置,因为onEnterTransitionDidFinish函数是在进入层而且过渡动画结束时候调用,代码放到这里不用考虑中前面场景是否有调用背景音乐停止语句。而且用户也不会先听到声音,后出现界面现象。

    综上所述,是否能够成功播放背景音乐,前面场景是否有调用背景音乐停止语句有关,也与当前场景中播放代码在哪个函数里有关。如果前面场景没有调用背景音乐停止语句,问题也就简单了,我们可以将播放代码放置在代码①、②、③任何一处。但是如果前面场景调用背景音乐停止语句,在onEnterTransitionDidFinish函数播放背景音乐会更好一些。

    更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
    本书交流讨论网站:http://www.cocoagame.net
    欢迎加入cocos2d-x技术讨论群:257760386、327403678
  • 相关阅读:
    uva 11488
    探测器-旅行者1号:百科
    理论-生命起源理论:百科
    定律:目录
    定律:百科
    理论:目录
    理论(哲学):百科
    理论:百科
    汉语-词语:潮汐
    物理-电磁-电磁相互作用:百科
  • 原文地址:https://www.cnblogs.com/iOS-Blog/p/3889897.html
Copyright © 2020-2023  润新知