1. 程式人生 > >Cocos2d-x 3.0心得(05)-音效管理

Cocos2d-x 3.0心得(05)-音效管理

相對於bgm,想自由的控制音效要麻煩不少,而且這種枯燥的東西恐怕也沒幾個人能耐下性子慢慢研究,算是作個記錄吧。

跟bgm一樣,下面的東西只針對iOS有效,移植其他平臺,還是老老實實用SimpleAudioEngine更輕鬆。

cocos裡面,音效的播放原理大致有兩步,讓我們從外層的開始說起。

首先,要播放一個音效檔案,我們得把它載入進記憶體,這通過[CDSoundEngine loadBuffer]方法來處理,載入得到的東西,我們稱它做buffer。這裡需要我們提供一個id,用來識別不同的音效檔案對應的buffer。。。是的,這個id是我們自定義的,所以我們需要自己想辦法來管理這些id。CDSoundEngine內部用陣列來快取buffer,id則是作為陣列下標,所以id必須是非負整數,而且不宜過大,通常是以遞增並且可回收的形式生成這些id。在cocos裡,這些id被稱為“soundId”。留意這些叫法,因為後面還有別的id。

載入得到的buffer,必須被附加到一個音效播放的槽位上,才能播放。這就好像是OpenGL裡圖片跟紋理的關係一樣。這些槽位被稱為source。和紋理一樣,source也有自己的id,cocos裡稱為“sourceId”。sourceId是由OpenAL生成,當我們建立了一個source,併為它附加了一個buffer之後,就可以播放了,順便還可以控制一下音調、音量之類的屬性。

現在我們已經可以控制音效了,看起來不怎麼複雜。下面來看看cocos怎麼管理這些音效。

CDSoundEngine的_buffers成員維護了所有被載入的音效資料。_buffers是一個動態陣列,初始化大小為64,每當呼叫loadBuffer時,通過我們傳遞的soundId作為下標,將載入的音效資料儲存在對應的位置下。如果給出的soundId超過陣列範圍,則_buffers會自動擴容;如果給定的soundId下已經存在音效資料,則會先釋放掉,然後載入新的並儲存。要主動釋放音效資料,則通過[CDSoundEngine unloadBuffer]方法,傳遞soundId作為引數。

CDSoundEngine的_sources成員儲存音效播放槽位的狀態,這也是一個數組。CDSoundEngine裡允許同時播放最多32個音效,因此_sources陣列的空間也就是32。每一個_sources元素記錄了一個sourceId(對應一個OpenAL Source物件,用來控制音效屬性、播放狀態)、被附加的buffer(音效資料,必須被附加到source上才能播放)。

CDSoundEngine還有一個音效分組的概念。_sourceGroups成員是一個數組,它分段儲存了_sources的下標,以及這些下標對應的source的其他狀態。預設情況下,分組只有1個。那這是用來幹嘛的?嗯,比方說,你想讓玩家單獨控制介面音效、戰鬥音效、人物語音的開關,就可以用到分組了。不過對於一個手機遊戲來說這貌似太奢侈了。

拋開那些總音量、總開關之類的東西,上面3個成員算是最主要的部分了,來看看它們是怎麼工作的。

首先初始化,_buffers陣列預設了64個空間,每個空間都還沒有資料,但是會保留一個OpenAL Buffer物件,並記錄bufferId。注意,這個bufferId是由OpenAL生成,在載入音效時,需要這個id選擇一個Buffer物件來儲存資料;在播放音效時,同樣用這個id來指定將要播放的音效。_buffers陣列自己的下標則被稱為soundId。沒錯,就是我們一開始提到的那個玩意。整個CDSoundEngine中各類id多如牛毛,不小心弄混了會讓人頭大。

接著是_sources陣列的初始化,設定32個空間,每個空間保留一個OpenAL Source物件,並記錄sourceId。sourceId也是OpenAL生成,用來控制一個音效的播放狀態、音量、音調等等。現在source上還沒有附加buffer,因此播放不了任何東西。

然後是_sourceGroups陣列,預設情況下這個陣列只有1個空間,記錄所有source的下標和使用情況。source的下標(sourceIndex)是用來在_sources陣列中作索引,跟sourceId是不同的。_sourceGroups陣列自己的下標則被稱為groupId。

要播放音效,首先我們要載入音效;要載入音效,則要確定放到_buffers的哪一個下標上。這就是[CDSoundEngine loadBuffer]方法中,soundId這個引數的由來。一般來說,我們都是從0開始,依次遞增;另外,如果我們主動釋放掉了某些音效資料,最好把對應的id回收以便重用。

loadBuffer成功之後,可以直接呼叫[CDSoundEngine playSound]來播放。引數soundId指定需要播放的音效,sourceGroupId通常都是0,pitch控制音調,1為原音調,大於1音調變高,小於1音調變低沉;pan控制聲道,-1為完全左聲道,1為完全右聲道,0則平衡;gain控制音量,1為原大小;loop則表示是否迴圈。

playSound方法首先通過迴圈檢查來找到一個沒有被使用的source,然後將soundId對應的buffer附加到source上,再進行播放。“沒有被使用的source”包含兩種概念,一個是指source當前沒有播放任何音效(附加了buffer,但是播放已經停止,也包含在內);另一個是指source當前沒有被鎖定。鎖定的概念我們下面會說到。任何一個不滿足的話,都會略過這個source繼續查詢下一個,直到找到一個可用的source,或者所有source都不可用,這時候就放不了任何音效了。

雖然說是迴圈檢查,但_sourceGroups還是會儲存最後一次查詢到的sourceIndex,下一次查詢會從這裡開始,以減少迴圈次數。另外,如果希望允許在source不夠用的情況下,新的音效頂掉舊的正在播放的音效,可以設定_sourceGroup的nonInterruptible為false,而這其實也是預設的設定。

playSound成功的話, 會返回sourceId,可以用來停止音效或作其他控制。

相對於playSound,CDSoundEngine還有一個soundSourceForSound方法,可以更自如的控制音效。soundSourceForSound同樣會先查詢一個可用的source,並且將指定的buffer附加到source上,然後,建立一個CDSoundSource物件,返回給呼叫者。CDSoundSource是對OpenAL source的一個簡單封裝,可以設定source的pitch、pan、gain、loop,控制播放、暫停等。

soundSourceForSound跟playSound最大的不同在於,返回CDSoundSource之前,會先鎖定對應的source。我們上面提過,在迴圈檢查可用的source時,被鎖定的source是會被略過的。playSound返回的sourceId,通常只在短時間內控制有效,如果經過的時間長了,可能sourceId已經被別的音效使用,這時候再用sourceId,會控制到預想之外的音效。而soundSourceForSound返回的CDSoundSource,只要不release,就會永久鎖定對應的source。這同時也表示,使用CDSoundSource需要格外小心,否則的話,就會發現一段時間之後遊戲裡所有的音效都放不出來了。

相關推薦

Cocos2d-x 3.0心得05音效管理

相對於bgm,想自由的控制音效要麻煩不少,而且這種枯燥的東西恐怕也沒幾個人能耐下性子慢慢研究,算是作個記錄吧。 跟bgm一樣,下面的東西只針對iOS有效,移植其他平臺,還是老老實實用SimpleAudioEngine更輕鬆。 cocos裡面,音效的播放原理大致有兩步,讓我

Cocos2d-x 3.0心得04BGM管理

用cocos2dx播放音樂音效算是很簡單的事了,沒什麼特殊需求的話,用SimpleAudioEngine就可以搞定。不過特殊需求總是會出現的。要是你經常聽歌,應該會有印象,某些播放器在切換音樂的時候,正在播放的音樂會逐漸淡出直到消失,然後才會播放新的音樂。如果想在遊戲裡也實

Cocos2d-x 3.0心得02粒子的位置型別PositionType

cocos2dx的粒子系統有三種位置型別,對我來說最常用的算是FREE了,因為這種粒子,一旦發射,位置就不會再跟隨粒子系統的Node(包括其父Node),移動粒子系統的話,可以形成所謂的“拖尾”,看起來更自然。 free粒子的位置,仍然是在粒子系統下的本地空間座標(雖然從

Cocos2d-x 3.0開發點選互動的四種處理

1、概述    遊戲也好,程式也好,只有能與使用者互動才有意義。手機上的互動大致可以分為兩部分:點選和輸入。其中點選更為重要,幾乎是遊戲中全部的互動。在Cocos2d-x 3.0中,更改了dispatc

Cocos2d-x 3.0 開發在程式中處理cocoStudio匯出動畫

1、概述    使用cocoStudio可以方便的製作動畫,接下來的工作就是在我們的程式中使用製作的動畫。這篇中,我將使用程式將兩個動畫連線起來。有圖有真相:2、製作動畫    承接上一篇,我們再製作一

Cocos2d-x 3.0開發十三使用CocoStudio編輯幀事件並關聯到程式

1、概述    幀事件也是新加入的功能。這篇中我們將看到如何使用它。我們將上篇中製作的動畫稍加修改。有圖為證:2、用途與原理    首先介紹一下幀事件。正如其名:一個與幀相關聯的事件。    為什麼要這

Cocos2d-x 3.0 開發十二在CocoStudio中使用粒子掛載與曲線動畫

1、概述    最新版本的CocoStudio在修復之前Bug的同時,加入了新功能,粒子掛載和曲線動畫就是其中的亮點。下面我們就動手做個例子,先上圖:    2、粒子掛載    執行CocoStudio

Cocos2d-x 3.0 打造一個全平臺概念文件夾

android cocos2d www 全平臺 -s http 概念 1-1 style Cocos2d-x 3.0 打造一個全平臺概念文件夾http:// www.eoeandroid.com/thread-328055-1-1.html Cocos2d

cocos2d-x 3.0 final 移植 android

filename details blank each 連接 python 頭文件 osd 需求 準備工作 你僅僅要依照上一篇的 cocos2d-x 3.0 final 環境搭建 完畢就能夠了 1.編輯proj.android\jni\Android.mk,更改內

[Cocos2d-x v3.x]Mac OX 創建新的Cocos2d-x 3.0 項目

tor cor code none cocos 分享 oid folder left 文章內容來自於: http://cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game Mac OS X 10.9 So

cocos2d-x 3.0 播放MP4視頻

獲取 cocos2 con selector lba 技術 root csdn 移除 猴子原創,歡迎轉載。轉載請註明: 轉載自Cocos2D開發網–Cocos2Dev.com,謝謝。原文地址: http://www.cocos2dev.com/?p=545非常久曾經寫的一

cocos2d-x 3.0 經常使用對象的創建方式

strong array 5% eat 自己 ++ -a 緩存 print cocos2d-x 3.0 中全部對象差點兒都能夠用create函數來創建,其它的創建方式也是有create函數衍生。 以下來介紹下create函數創建一般對象的方法,省得開發中常常忘記啥的。

5.27:cocos2d-x初探學習筆記2--重要概念及Test樣例結構(轉)

這樣的 發生 菜單 add css 基礎 dsm 人的 添加 1.幾個重要概念 在cocos2d引擎中,有幾個概念,各自是導演。場景,布景和人物角色。 導演(CCDirector):在cocos2d-x引擎中,導演類是遊戲的組織者和領導者。導演制定規則讓遊戲內的場

cocos2d-x 3.0 Loading界面實現

int start popu tor controls lec -a ttf 提高 信息 這個世界每一天都在驗證我們的渺小,但我們卻在努力創造,不斷的在這生活的畫卷中留下自己的腳印。或許等到我們老去的那一天,老得不能動僅僅能靠回顧的那一天。你躺在輪椅上,不斷的回顧過

cocos2d-x 3.0的坑有哪些

命令行 工程文件 模擬 directory file run eclipse setup.py ports 問題一:setup.py 之後, ANT文件夾為什麽創建不成功? ANT文件夾要指定到bin以下,NDK和SDK則指定要根文件夾就可以 問題二:cocos

用 批處理 安裝,編譯 Cocos2d-X 3.0---Windows

align 而且 ble java jdk its 微軟雅黑 ndk files 本文檔適用: Win7 32bits(XP 32bits可能適用,未測試)開發目標環境 Android 軟件版本號 2014年5月下載,當時為較新版本號. 由於Cocos2d-X從

cocos2d-x 3.0遊戲實例學習筆記《卡牌塔防》第一步---開始界面&關卡選擇

cocos2d-x 版本號 blog evel nbsp 不同 null menuitem obj /* 說明: **1.本次遊戲實例是《cocos2d-x遊戲開發之旅》上的最後一個遊戲,這裏用3.0重寫並做下筆記 **2.我也問過木頭本人啦。他說:

關於cocos2d-x 3.0的點擊交互處理

clipboard 3.0 static php 此外 eas -h con spl 轉自:http://blog.csdn.net/fansongy/article/details/12716671 1、概述 遊戲也好,程序也好,僅僅有能與

Cocos2d-x 3.0 基礎系列一】 各類回調函數寫法匯總

void ont white fort instance gles dir ner mdi 一、button回調 1. Lambda 表達式,C++11 Lambda 賦予了Cocos2d-x 3.0創建回調函數的靈活性。 auto it

COCOS2D-X 3.0在MAC下創建新IOS項目:

col size clas ios 版本號 ons -m 創建 版本 首先進入:CocoStudio\Source\3.0\cocos2d-x\tools\cocos2d-console\bin 運行 ./cocos new -p com.aaaa -l cpp