zoukankan      html  css  js  c++  java
  • Cocos2d-x中播放背景音乐

    背景音乐的播放与停止实例代码例如以下:
    SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/Jazz.mp3", true);
    SimpleAudioEngine::getInstance()->stopBackgroundMusic("sound/Jazz.mp3");


    背景音乐的播放代码放置到什么地方比較适合呢?比如:在Setting场景中。主要代码例如以下:
    bool Setting::init()
    {
    	//播放代码 																①
        return true;
    }
    
    
    void Setting::onEnter()
    {
    	Layer::onEnter();
    	log("Setting onEnter");
    	//播放代码 																②
    }
    
    
    void Setting::onEnterTransitionDidFinish()
    {
    	Layer::onEnterTransitionDidFinish();
    	log("Setting onEnterTransitionDidFinish");	
    	//播放代码 																③
    }
    
    
    void Setting::onExit()
    {
    	Layer::onExit();
    	log("Setting onExit");											
    }
    
    
    void Setting::onExitTransitionDidStart()
    {
    	Layer::onExitTransitionDidStart();
    	log("Setting onExitTransitionDidStart");								
    }
    
    
    void Setting::cleanup()
    {
    	Layer::cleanup();														
    	log("Setting cleanup");
    }
    



    关于播放背景音乐,理论上我们是能够将播放代码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函数播放背景音乐会更好一些。


    很多其它内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
    本书交流讨论站点:http://www.cocoagame.net
    很多其它精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
    欢迎增加Cocos2d-x技术讨论群:257760386


    《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

    京东:http://item.jd.com/11584534.html

    亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

    当当:http://product.dangdang.com/23606265.html

    互动出版网:http://product.china-pub.com/3770734

    《Cocos2d-x实战 C++卷》源代码及样章下载地址:

    源代码下载地址:http://51work6.com/forum.php?

    mod=viewthread&tid=1155&extra=page%3D1 

    样章下载地址:http://51work6.com/forum.php?

    mod=viewthread&tid=1157&extra=page%3D1

    欢迎关注智捷iOS课堂微信公共平台

  • 相关阅读:
    springboot的整合篇-springmvc,mybatis,数据库等
    快速搭建springboot工程
    Git常用命令
    SpringBoot整合通用Mapper
    SpringBoot项目部署
    实例化调用和静态方式调用的区别
    CentOS系统安装PHP7.3
    CentOS7部署LNMP环境
    Apache和Nginx的区别
    Linux系统下卸载MySQL
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6846371.html
Copyright © 2011-2022 走看看