Cocos2d-x提供了一个音频CocosDenshion引擎,CocosDenshion引擎可以独立于Cocos2d-x单独使用,CocosDenshion引擎本质上封装了OpenAL音频处理库。具体使用的API是SimpleAudioEngine。在大多数平台上,cocos2d-x可以调用不同的SDK API来播放背景音乐和音效。CocosDenshion音频引擎只能在同一时间只能播放一首背景音乐,但是能同时播放许多音效。下面列举CocosDenshion引擎下的SimpleAudioEngine的几个常用函数:

  1. void preloadBackgroundMusic (const char *pszFilePath) 预处理背景音乐文
  2. void preloadEffect(sound/Blip.wav);预处理音效文件
  3. void playBackgroundMusic (const char *pszFilePath) 播放背景音乐。
    void stopBackgroundMusic () 停止播放背景音乐。
    void pauseBackgroundMusic () 暂停播放背景音乐。
  4. void resumeBackgroundMusic () 继续播放背景音乐。
    bool isBackgroundMusicPlaying () 判断背景音乐是否在播放。
    unsigned int playEffect (const char *pszFilePath) 播放音效。
  5. void pauseEffect (unsigned int nSoundId) 暂停播放音效,参数nSoundId playEffect函数返回ID
  6. void pauseAllEffects () 暂停所有播放音效。
  7. void resumeEffect (unsigned int nSoundId) 继续播放音效,参数nSoundId playEffect函数返回ID
    void resumeAllEffects () 继续播放所有音效。
  8. void stopEffect (unsigned int nSoundId) 停止播放音效,参数nSoundId playEffect函数返回ID
    void stopAllEffects () 停止所有播放音效。
    void preloadEffect (const char *pszFilePath) 预处理音效音频文件,将压缩格式的文件进行解压处理,如MP3解压为WAV

音频的预处理:

无论 是播放背景音乐还是音效在播放之前进行预处理是有必要的,这个过程是对于音频文件进行解压等处理,预处理只需要在整个游戏运行过程中处理依次就可以了。如 果不进预处理,则会发现在第一次播放这个音频文件时候感觉很“卡”,用户体验不好。可以将它理解于类似于图片的异步加载

同样的原理,音频的预处理也就是提前加载进来。

CocosDenshion注意点:

在三星某些手机上,以9100为例,貌似它的音频驱动存在bug ,播放太多个音效的话程序会直接崩掉,所以在三星的机子上应该避免频繁的多个调用播放音效文件。

音频的封装:

游戏我们必不可缺少的就是用到音频播放与声音设置大小之类的,如果用到地方就获取单例调用一次貌似有点不太专业也不好管理,所以个人平时是直接把它们集中封装在一个单例类里。下面以我某个项目中的音频封装例子贴出代码举例:

  1. //头文件部分
  2. class Audio
  3. {
  4. public:
  5. static Audio* getInstance();
  6. //析构单例
  7. ~Audio();
  8. //预处理音频
  9. void preloadAudio();
  10. //播放背景音乐
  11. void playBgMusic();
  12. //播放音效
  13. void playJump();
  14. void playAttack();
  15. void playHit();
  16. void playClickd();
  17. void playGameOver();
  18. //设置背景音乐大小
  19. void setMusicVol(float vol);
  20. //设置音效大小
  21. void setEffectVol(float vol);
  22. //停止所有音频播放
  23. void stopSound();
  24. float musicVom=;
  25. float effectVom=;
  26. private:
  27. static Audio* instance;
  28. };
  1. //cpp部分
  2. #include "Audio.h"
  3. #include <SimpleAudioEngine.h>
  4. #include <cocos2d.h>
  5. using namespace CocosDenshion;
  6. Audio* Audio::instance =nullptr;
  7. Audio* Audio::getInstance()
  8. {
  9. if (instance ==nullptr)
  10. {
  11. instance =new Audio();
  12. }
  13. return instance;
  14. }
  15.  
  16. Audio::~Audio()
  17. {
  18. if (instance !=nullptr)
  19. {
  20. delete instance;
  21. instance =nullptr;
  22. }
  23. }
  24. void Audio::preloadAudio()
  25. {
  26. //加载音频
  27. SimpleAudioEngine::getInstance()->preloadEffect("attack.mp3");
  28. SimpleAudioEngine::getInstance()->preloadEffect("game-over.mp3");
  29. SimpleAudioEngine::getInstance()->preloadEffect("hit.mp3");
  30. SimpleAudioEngine::getInstance()->preloadEffect("jump.mp3");
  31. SimpleAudioEngine::getInstance()->preloadEffect("pain.mp3");
  32. SimpleAudioEngine::getInstance()->preloadEffect("button.mp3");
  33.  
  34. }
  35. void Audio::playBgMusic()
  36. {
  37. //播放背景音乐
  38. // SimpleAudioEngine::getInstance()->playBackgroundMusic("bg.mp3",true);
  39. }
  40. void Audio::playGameOver()
  41. {
  42. //播放音效
  43. SimpleAudioEngine::getInstance()->playEffect("game-over.mp3");
  44. }
  45. void Audio::playJump()
  46. {
  47. SimpleAudioEngine::getInstance()->playEffect("jump.mp3");
  48. }
  49. void Audio::playAttack()
  50. {
  51. SimpleAudioEngine::getInstance()->playEffect("attack.mp3");
  52. }
  53. void Audio::playHit()
  54. {
  55. SimpleAudioEngine::getInstance()->playEffect("hit.mp3");
  56. }
  57. void Audio::playClickd()
  58. {
  59. SimpleAudioEngine::getInstance()->playEffect("button.mp3");
  60. }
  61. void Audio::setMusicVol(float vol)
  62. {
  63. SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(vol);
  64. }
  65. void Audio::setEffectVol(float vol)
  66. {
  67. SimpleAudioEngine::getInstance()->setEffectsVolume(vol);
  68. }
  69. void Audio::stopSound()
  70. {
  71. SimpleAudioEngine::getInstance()->stopAllEffects();
  72. SimpleAudioEngine::getInstance()->stopBackgroundMusic();
  73. }

大致的封装就是如此,具体根据自己的项目进行封装。这样是不是就是方便管理。只要音频文件名需要更改,只需要从音频单例里进行更改而不用处处找了。

注意:

在对SimpleAudioEngine进行使用时,必须先引用SimpleAudioEngine头文件,再而引入CocosDenshion命名空间。如果想问为什么。请默默回去把C++部分的命名空间知识点先了解清楚。

ok.关于Cocos2d的音频知识就分享到此,有讲得不对的地方还望指出进行探讨互相学习!

 

【Cocos2d入门教程八】浅析Cocoss2d下的音频引擎及封装音频类的更多相关文章

  1. Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine

    1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboa ...

  2. RabbitMQ入门教程(八):远程过程调用RPC

    原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...

  3. 【Cocos2d入门教程四】Cocos2d-x菜单篇

    游戏世界多姿多彩,无论多靓丽的游戏,多耐玩的游戏,在与游戏用户交互上的往往是菜单. 上一章我们已经大概了解了导演.节点.层.精灵.这一章以菜单为主题. 菜单(Menu)包含以下内容: 1.精灵菜单项( ...

  4. CTF必备技能丨Linux Pwn入门教程——ROP技术(下)

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  5. 【Cocos2d入门教程六】Cocos2d-x事件篇之触摸

    Cocos游戏当中产生一个事件时,可以有多个对象在监听该事件,所以有优先级(Priority).优先级越高(Priority值越小),事件响应越靠前. 关系图: 新 事件分发机制:在2.x 版本事件处 ...

  6. 【Cocos2d入门教程三】HelloWorld之一目了然

    什么程序都是从HelloWorld先开始.同样Cocos2d-x我们先从HelloWorld进行下手.下面是HelloWorld的运行完成图: 建立好的Cocos游戏项目中会有两个比较常用接触的文件夹 ...

  7. 【Cocos2d入门教程七】三分钟看懂Cocos2d坐标系

    无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥搞头了.所以玩cocos2d,一上来就需要先把各种与坐标有关的东西搞清楚. 1.OpenGL坐标系 Cocos2d-x使用的是O ...

  8. Entity Framework入门教程(14)---DbFirst下的存储过程

    EF6中DbFirst模式下使用存储过程 我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql ...

  9. linux入门教程(八) Linux磁盘管理

    [查看磁盘或者目录的容量 df 和 du] df 查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认是按k为单位显示的 df常用参数有 –i -h -k –m等 -i 使用inode ...

随机推荐

  1. MES生产日报存储过程

    USE [ScreenMonitor]GO/****** Object: StoredProcedure [dbo].[ImportProductForDay] Script Date: 04/11/ ...

  2. SQLite内存数据库

    [转]SQLite内存数据库 http://www.cnblogs.com/liuyong/archive/2010/09/14/1826152.html SQLite 介绍 一. SQLite 是实 ...

  3. SQL SERVER 2008/2012/2012R2/2014 设置开启远程连接(sa配置)

    本文方案适用于Microsoft Sql Server 2008/2012/2012 r2/2014版本,以下简称MSSQLSERVER. MSSQL默认是不允许远程连接,并且禁用sa账户的.如果想要 ...

  4. 详解Oracle创建用户权限全过程

    本文将介绍的是通过创建一张表,进而实现Oracle创建用户权限的过程.以下这些代码主要也就是为实现Oracle创建用户权限而编写,希望能对大家有所帮助. 注意:每条语语分开执行,结尾必须用分号; // ...

  5. CentOS 6.5安装MySQL中文乱码问题解决

    不管是Linux还是Windows都有新手遇到MySQL服务安装好了之后写入中文发现乱码,今天我装了个CentOS 6.5也遇到了这个问题,现在解决了,分享一下经验. 1.首先安装mysql,我很怕麻 ...

  6. 现在的SEO最须要会点啥

    如今的SEO最须要会点啥,会飞天,会遁地,NONONO,不须要你这么流弊,咳咳,不瞎扯.在以往SEO的就是从搜索引擎中获取免费流量.是啊,曾经多好弄啊.而如今在我们不但须要流量还须要把流量进行转换,毕 ...

  7. Java中for循环以及循环中标签

    1.第一种,通过迭代的方式 File[] listFiles = file.listFiles(); for (Iterator iterator = files.iterator(); iterat ...

  8. Asp.Net MVC 3【Filters(过滤器)】

    这里分享MVC里的Filters(过滤器),什么是MVC里的过滤器,他的作用是什么? 过滤器的请求处理管道中注入额外的逻辑.他们提供了一个简单而优雅的方式来实现横切关注点.这个术语是指所有对应用程序的 ...

  9. TCP/IP协议知识科普

    简介 本文主要介绍了工作中常用的TCP/IP对应协议栈相关基础知识,科普文. 本博客所有文章:http://www.cnblogs.com/xuanku/p/index.html TCP/IP网络协议 ...

  10. 结构体定义 typedef struct 用法详解和用法小结

    typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...