天天看點

瘋狂ios之cocos2d中的聲音

13.13 cocos2d中的聲音

任何一個遊戲中都不能缺少音樂和音效,蘋果公司在iOS系統中提供了兩個架構用于播放音樂,分别是AVAudioPlayer和OpenAL。使用AVAudioPlayer播放音樂非常簡單,但對音樂的控制方法很有限。而OpenAL是一個低級API,支援更多的特性,但是使用起來比AVAudioPlayer要複雜得多。cocos2d提供了cocosDenshion音效引擎,這是一套用于聲音控制的類庫,支援iOS和OS X系統,可以讓遊戲開發者很友善地使用AVAudioPlayer和OpenAL這兩個架構,同時不用考慮如何使用底層的API。

 cocosDenshion提供了多個API,如CDSoundEngine、CDAudioManager和SimpleAudioEngine,本節我們會重點學習SimpleAudioEngine。

13.13.1 SimpleAudioEngine 

 SimpleAudioEngine是最簡單、常用的API,可以很簡單地播放背景音樂和音效,并實作一些最基本的聲音控制操作。

使用SimpleAudioEngine的必備條件如下。

需要在項目中添加OpenAL、AudioToolbox和AVFoundation架構。

需要在項目中添加SimpleAudioEngine.*、CocosDenshion.*、CDAudioManager.*、CDOpenALSupport.h和CDConfig.h等檔案。

 SimpleAudioEngine的常用方法如下。

 +(SimpleAudioEngine*)sharedEngine:單例方法,傳回共享的SimpleAudioEngine執行個體對象。

 -(void) preloadBackgroundMusic:(NSString*) filePath:把遊戲中需要用到的背景音樂提前加載。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"background.mp3"]; 

 -(void)playBackgroundMusic:(NSString*) filePath:播放背景音樂。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"background.mp3"]; 

 -(void)pauseBackgroundMusic:暫停背景音樂。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] puseBackgroundMusic]; 

 -(void)resumeBackgroundMusic:繼續播放背景音樂。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] resumeBackgroundMusic]; 

  -(void)stopBackgroundMusic:停止背景音樂。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] stopBackgroundMusic]; 

  -(void)preloadEffect:(NSString*) filePath:把遊戲中需要用到的音效提前加載。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] preloadEffect:@"effect1.mp3"]; 

  -(ALuint)playEffect:(NSString*) filePath:播放音效。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] playEffect:@"effect1.mp3"]; 

-(void)setMute:(BOOL) muteValue:設定靜音。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] setMute:YES]; 

 -(void)setBackgroundMusicVolume:(float) volume:設定背景音樂音量大小。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] setBackgroundMusicVolume:0.5f]; 

 -(void)setEffectsVolume:(float) volume:設定音效大小。示例代碼如下:

 [[SimpleAudioEngine sharedEngine] setEffectsVolume:2.0f]; 

以上是SimpleAudioEngine類的常用方法,接下來通過示例示範如何使用SimpleAudioEngine類控制遊戲的背景音樂和音效。

使用SimpleAudioEngine類先要做一些準備工作,步驟如下。

瘋狂ios之cocos2d中的聲音

                             圖[font=]13.54 添加相關的架構

将準備好的聲音和字型檔案拖到Xcode的“Resources”中,記得要選中“Copy items into destination group’s folder”複選框。

在檔案開頭導入SimpleAudioEngine類檔案。

 #import "SimpleAudioEngine.h" 

接下來,就可以開始使用SimpleAudioEngine類了。

1. 添加背景音樂

在init方法裡面添加一段代碼,使用SimpleAudioEngine播放背景音樂,實作代碼如下。

程式清單:codes/13/13.13/SimpleAudioEngineTest/SimpleAudioEngineTest/HelloWorldLayer.m 

 -(id) init 

 { 

  if( (self=[super init]) ) { 

  CGSize winSzie = [[CCDirector sharedDirector] winSize]; 

  // 建立一個标簽

  CCLabelBMFont* label = [CCLabelBMFont 

  labelWithString:@"playBackgroundMusic" fntFile:@"menu.fnt"]; 

  label.position = ccp(winSzie.width/2,winSzie.height/2); 

  [self addChild:label]; 

  // 播放背景音樂

[[SimpleAudioEngine sharedEngine]

playBackgroundMusic:@"bgmusic.mp3" loop:YES];

  } 

  return self; 

 } 

以上代碼比較簡單,首先建立了一個标簽,設定在螢幕正中,然後使用SimpleAudioEngine的sharedEngine方法擷取一個單例對象,調用playBackgroundMusic方法播放bgmusic.mp3檔案,并不斷循環播放。單擊“Run”按鈕執行SimpleAudioEngineTest項目,模拟器顯示标簽,同時可以聽到背景音樂。

2. 控制背景音樂

如何手動控制背景音樂的播放和停止呢?其實非常容易,實作代碼如下。

程式清單:codes/13/13.13/SimpleAudioEngineTest/SimpleAudioEngineTest/PlayLayer.m 

  NSString* fontName = @"menu.fnt"; 

   CGSize winSzie = [[CCDirector sharedDirector] winSize]; 

  // 建立播放音樂标簽

  CCLabelBMFont* palyLabel = [CCLabelBMFont  

  labelWithString:@"play" fntFile:fontName]; 

  // 建立播放音樂的Item,當觸碰時會調用playBackgroundMusic方法

  CCMenuItemLabel* playItem = [CCMenuItemLabel itemWithLabel:palyLabel 

  target:self selector:@selector(playBackgroundMusic:)]; 

   // 建立停止音樂标簽

  CCLabelBMFont* stopLabel = [CCLabelBMFont 

  labelWithString:@"stop" fntFile:fontName]; 

  // 建立停止音樂的Item,當觸碰時會調用stopBackgroundMusic方法

  CCMenuItemLabel* stopItem = [CCMenuItemLabel itemWithLabel:stopLabel  

   target:self selector:@selector(stopBackgroundMusic:)]; 

  // 建立暫停音樂标簽

  CCLabelBMFont* pauseLabel = [CCLabelBMFont  

  labelWithString:@"pause" fntFile:fontName]; 

  // 建立暫停音樂的Item,當觸碰時會調用pauseBackgroundMusic方法

  CCMenuItemLabel* pauseItem = [CCMenuItemLabel itemWithLabel:pauseLabel 

  target:self selector:@selector(pauseBackgroundMusic:)]; 

  // 建立繼續播放音樂标簽

  CCLabelBMFont* resumeLabel = [CCLabelBMFont  

  labelWithString:@"resume" fntFile:fontName]; 

  // 建立繼續播放音樂的Item,當觸碰時會調用resumeBackgroundMusic方法

  CCMenuItemLabel* resumeItem = [CCMenuItemLabel itemWithLabel:resumeLabel 

  target:self selector:@selector(resumeBackgroundMusic:)]; 

  // 設定菜單Item坐标位置

  playItem.position=ccp(winSzie.width/2,winSzie.height*0.6); 

  stopItem.position=ccp(winSzie.width/2,winSzie.height*0.4); 

  pauseItem.position=ccp(winSzie.width/2,winSzie.height*0.2); 

  resumeItem.position=ccp(winSzie.width/2,winSzie.height*0.8); 

  // 建立菜單,将所有Item加進去

  CCMenu* menu = [CCMenu menuWithItems:playItem,stopItem,pauseItem,resumeItem,nil]; 

  menu.position = CGPointZero; 

  [self addChild:menu]; 

 // 播放背景音樂的方法

 -(void) playBackgroundMusic:(id)sender{ 

[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"bgmusic.mp3" loop:YES];

 // 停止背景音樂的方法

 -(void) stopBackgroundMusic:(id)sender{ 

[[SimpleAudioEngine sharedEngine] stopBackgroundMusic];

 // 暫停背景音樂的方法

 -(void) pauseBackgroundMusic:(id)sender{ 

[[SimpleAudioEngine sharedEngine] pauseBackgroundMusic];

 // 繼續播放背景音樂的方法

 -(void) resumeBackgroundMusic:(id)sender{ 

[[SimpleAudioEngine sharedEngine] resumeBackgroundMusic];

以上init方法中的代碼添加了4個标簽,根據4個标簽建立了4個菜單項,最後建立了一個菜單,該菜單由上面的4個菜單項組成,分别用于播放、停止、暫停、繼續背景音樂。接下來,在init方法之後,添加菜單項對應的4個方法。單擊“Run”按鈕執行SimpleAudioEngineTest項目,模拟器顯示如圖13.55所示。

瘋狂ios之cocos2d中的聲音

             圖13.55 控制背景音樂播放的界面

觸碰“play”菜單項時,可以聽到美妙的背景音樂;觸碰“pause”菜單項時,背景音樂會暫停;觸碰“resume”菜單項時,背景音樂會繼續;觸碰“stop”菜單項時,背景音樂會停止。

3. 添加音效

現在,我們已經可以控制背景音樂了,讓我們來加入音效吧。在init方法中添加一段代碼,如下所示(程式清單同上)。

 // 建立音效标簽

 CCLabelBMFont* effectLabel = [CCLabelBMFont 

  labelWithString:@"effect" fntFile:fontName]; 

 // 建立音效的Item,當觸碰時會調用soundEffect方法

 CCMenuItemLabel *effectItem = [CCMenuItemLabel itemWithLabel:effectLabel  

  target:self selector:@selector(soundEffect:)]; 

 // 設定菜單Item坐标位置

 effectItem.position = ccp(winSize.width*0.2,winSize.height*0.65); 

 // 建立菜單,将所有Item加進去

 CCMenu* menu = [CCMenu menuWithItems:playItem,stopItem,pauseItem 

  ,resumeItem,effectItem, nil]; 

在init方法之後添加一個soundEffect方法,代碼如下:

 -(void) soundEffect:(id) sender{ 

// pitch參數指定高音參數,pan指定OpenAL中的音源位置

// gain參數指定音量增益

[[SimpleAudioEngine sharedEngine] playEffect:@"effect.mp3" pitch:12.0 pan:5.0 gain:2.0];

再次運作程式,觸碰“effect”菜單項,就可以聽見音效了。

13.13.2 遊戲中的聲音設定選項功能實作

很多遊戲在菜單中都提供了設定聲音選項,包括打開或關閉背景音樂、設定音量大小等。這些功能是如何實作的呢?下面我們就用一個簡單的示例來完成聲音設定功能。

使用cocos2d模闆建立一個項目,命名為“MenuSettingTest”,将準備好的聲音檔案拖到Xcode的“Resources中”,記得要選中“Copy items into destination group’s folder”複選框。

首先在init方法中添加一段代碼,如下所示。

程式清單:codes/13/13.13/MenuSettingTest/MenuSettingTest/HelloWorldLayer.m 

  CGSize winSize = [[CCDirector sharedDirector] winSize]; 

  // 建立“播放背景音樂”标簽,當觸碰該标簽時,調用playBackgroundMusic方法

  CCMenuItemFont* playItem= [CCMenuItemFont itemWithString:@"播放背景音樂" 

  // 設定“播放背景音樂”标簽位置

  playItem.position=ccp(winSize.width/2,winSize.height*0.6); 

  // 建立“設定”标簽,當觸碰該标簽時,調用setting方法

  CCMenuItemFont* settingItem = [CCMenuItemFont itemWithString:@"設定" 

  target:self selector:@selector(setting:)]; 

  // 設定“設定”标簽位置

  settingItem.position=ccp(winSize.width/2,winSize.height*0.4); 

  // 建立控制菜單,并将兩個标簽添加進去

  CCMenu* menu = [CCMenu menuWithItems: playItem,settingItem,nil]; 

以上代碼建立了兩個菜單項,其中一個觸碰後會播放音樂,另一個觸碰後會進入設定界面,并将兩個菜單項添加到一個菜單中,然後将菜單顯示在螢幕當中。

在init方法之後添加playBackgroundMusic和setting方法,代碼如下(程式清單同上):

  [[SimpleAudioEngine sharedEngine] playBackgroundMusic: 

  @"bgmusic.mp3" loop:YES]; 

 // 設定音效方法

 -(void) setting:(id)sender{ 

  // 停止背景音樂

  [[SimpleAudioEngine sharedEngine] stopBackgroundMusic]; 

  // 切換到SettingLayer場景

  CCTransitionSlideInL* transitionScene = [CCTransitionSlideInL 

  transitionWithDuration:2.0 scene:[SettingLayer scene]]; 

  [[CCDirector sharedDirector] replaceScene:transitionScene]; 

以上代碼的作用如下。

 -(void) playBackgroundMusic:(id)sender:該方法調用單例方法擷取SimpleAudioEngine執行個體并循環播放背景音樂。

 -(void) setting:(id)sender:該方法首先調用單例方法擷取SimpleAudioEngine執行個體,停止背景音樂,然後使用一個場景切換效果切換到SettingLayer場景。

然後使用cocos2d模闆建立SettingLayer類,該類用于設定背景音樂的開關效果。

在SettingLayer.h檔案中添加方法聲明:

 +(CCScene *) scene; 

切換到SettingLayer.m檔案,在檔案頂部導入檔案:

 #import " HelloWorldLayer.h" 

 #import "CDAudioManager.h" 

接下來在init方法中添加一段代碼,如下所示。

程式清單:codes/13/13.13/MenuSettingTest/MenuSettingTest/SettingLayer.m 

  // 提示菜單項

  CCMenuItemFont* musicItem = [CCMenuItemFont itemWithString:@"背景音樂:"]; 

  musicItem.position = ccp(winSize.width*0.4,winSize.height*0.6); 

  // 建立“開”和“關”菜單項

  CCMenuItemFont* musicOn = [CCMenuItemFont itemWithString:@"開"]; 

  CCMenuItemFont* musicOff = [CCMenuItemFont itemWithString:@"關"]; 

  // CCMenuItemToggle,預設顯示開。開=0,關=1 

  CCMenuItemToggle* musicToggle = [CCMenuItemToggle itemWithTarget:self 

  selector:@selector(change:) items:musicOff,musicOn,nil]; 

  musicToggle.position = ccp(winSize.width*0.7,winSize.height*0.6); 

  // 建立“傳回主菜單“菜單項

  CCMenuItemFont* returnItem= [CCMenuItemFont itemWithString:@"傳回主菜單" 

  target:self selector:@selector(backToMainLayer:)]; 

  returnItem.position = ccp(winSize.width/2,winSize.height*0.4); 

  // 建立控制菜單,并将3個标簽添加進去

   CCMenu* menu = [CCMenu menuWithItems:musicItem,musicToggle,returnItem,nil]; 

以上代碼建立了一個musicItem菜單項用于顯示“背景音樂”,musicToggle切換開關觸碰時用于開啟或者關閉背景音樂,returnItem傳回标簽觸碰時傳回播放背景音樂主場景。

在init方法之後添加chang和backToMainLayer方法,代碼如下:

 -(void) change:(id)sender{ 

  // 判斷mute(靜音)屬性,根據屬性狀态進行切換

  if([CDAudioManager sharedManager].mute == TRUE){ 

  [CDAudioManager sharedManager].mute = FALSE; 

  }else{ 

  [CDAudioManager sharedManager].mute = TRUE; 

 // 定義一個CCTransitionSlideInL場景切換效果,并使用CCDirector單例對象來切換場景

 -(void) backToMainLayer:(id)sender{ 

  transitionWithDuration:2.0 scene:[ HelloWorldLayer scene]]; 

 -(void) change:(id)sender:當選擇切換開關來開啟或者關閉時,使用CDAudioManager的單例對象,判斷mute(靜音)屬性來切換開關。

     q     -(void) backToMainLayer:(id)sender:使用一個場景切換效果切換到MainLayer場景。

單擊“Run”按鈕執行MenuSettingTest項目,模拟器顯示如圖13.56所示。

瘋狂ios之cocos2d中的聲音

           圖13.56 菜單設定界面

觸碰“播放背景音樂”菜單項時,會播放背景音樂;觸碰“設定”菜單項時,會切換到背景音樂設定場景,模拟器顯示如圖13.57所示。

瘋狂ios之cocos2d中的聲音

        圖13.57 背景音樂設定場景

背景音樂的預設狀态是“開”,觸碰“開”菜單項切換音樂開關,背景音樂狀态轉換成“關”。此時觸碰“傳回主菜單”菜單項,再觸碰“播放背景音樂”菜單項時,不會再播放背景音樂了。

這樣,我們就完成了一個簡單的聲音設定功能。後面我們會将這個功能整合到遊戲當中。

本文轉自 

fkJava李剛 51CTO部落格,原文連結:http://blog.51cto.com/javaligang/1396487 ,如需轉載請自行聯系原作者

繼續閱讀