瘋狂ios之cocos2d中的聲音

13.13 cocos2d中的聲音

任何一個遊戲中都不能缺乏音樂和音效,蘋果公司在iOS系統中提供了兩個框架用於播放音樂,分別是AVAudioPlayerOpenAL。使用AVAudioPlayer播放音樂很是簡單,但對音樂的控制方法頗有限。而OpenAL是一個低級API,支持更多的特性,可是使用起來比AVAudioPlayer要複雜得多。cocos2d提供了cocosDenshion音效引擎,這是一套用於聲音控制的類庫,支持iOSOS X系統,可讓遊戲開發者很方便地使用AVAudioPlayerOpenAL這兩個框架,同時不用考慮如何使用底層的API
 cocosDenshion提供了多個API,如CDSoundEngineCDAudioManagerSimpleAudioEngine本節咱們會重點學習 SimpleAudioEngine
13.13.1 SimpleAudioEngine
 SimpleAudioEngine是最簡單、經常使用的API,能夠很簡單地播放背景音樂和音效,並實現一些最基本的聲音控制操做。
使用SimpleAudioEngine的必備條件以下。
須要在項目中添加OpenALAudioToolboxAVFoundation框架。
須要在項目中添加SimpleAudioEngine.*CocosDenshion.*CDAudioManager.*CDOpenALSupport.hCDConfig.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類先要作一些準備工做,步驟以下。
使用cocos2d模板新建一個項目,命名爲「SimpleAudioEngineTest」。在Xcode 4以後會在項目中默認加入OpenALAudioToolboxAVFoundation框架,咱們能夠展開「Build Phases」下面的「Link Binary With Libraries」查看,如圖13.54所示。140638_Jd23_262659.jpg
                             圖[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;
 }
以上代碼比較簡單,首先建立了一個標籤,設置在屏幕正中,而後使用SimpleAudioEnginesharedEngine方法獲取一個單例對象,調用playBackgroundMusic方法播放bgmusic.mp3文件,並不斷循環播放。單擊「Run」按鈕執行SimpleAudioEngineTest項目,模擬器顯示標籤,同時能夠聽到背景音樂。
2. 控制背景音樂
如何手動控制背景音樂的播放和中止呢?其實很是容易,實現代碼以下。
程序清單:codes/13/13.13/SimpleAudioEngineTest/SimpleAudioEngineTest/PlayLayer.m
 -(id) init
 {
  if( (self=[super init]) ) {
  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];
  }
  return self;
 }
 // 播放背景音樂的方法
 -(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所示。
140750_QeZQ_262659.jpg
             圖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
 -(id) init
 {
  if( (self=[super init]) ) {
  CGSize winSize = [[CCDirector sharedDirector] winSize];
  // 建立「播放背景音樂」標籤,當觸碰該標籤時,調用playBackgroundMusic方法
  CCMenuItemFont* playItem= [CCMenuItemFont itemWithString:@"播放背景音樂"
  target:self selector:@selector(playBackgroundMusic:)];
  // 設置「播放背景音樂」標籤位置
  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];
  menu.position = CGPointZero;
  [self addChild:menu];
  }
  return self;
 }
以上代碼建立了兩個菜單項,其中一個觸碰後會播放音樂,另外一個觸碰後會進入設置界面,並將兩個菜單項添加到一個菜單中,而後將菜單顯示在屏幕當中。
init方法以後添加playBackgroundMusicsetting方法,代碼以下(程序清單同上):

 // 播放背景音樂的方法
 -(void) playBackgroundMusic:(id)sender{
  [[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
 -(id) init
 {
  if( (self=[super init]) ) {
  CGSize winSize = [[CCDirector sharedDirector] winSize];
  // 提示菜單項
  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];
  menu.position = CGPointZero;
  [self addChild:menu];
  }
  return self;
 }
以上代碼建立了一個musicItem菜單項用於顯示「背景音樂」,musicToggle切換開關觸碰時用於開啓或者關閉背景音樂,returnItem返回標籤觸碰時返回播放背景音樂主場景。
init方法以後添加changbackToMainLayer方法,代碼以下:
 -(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{
  CCTransitionSlideInL* transitionScene = [CCTransitionSlideInL
  transitionWithDuration:2.0 scene:[ HelloWorldLayer scene]];
  [[CCDirector sharedDirector] replaceScene:transitionScene];
 }
以上代碼的做用以下。
 -(void) change:(id)sender:當選擇切換開關來開啓或者關閉時,使用CDAudioManager的單例對象,判斷mute(靜音)屬性來切換開關。
     q     -(void) backToMainLayer:(id)sender:使用一個場景切換效果切換到MainLayer場景。
單擊「Run」按鈕執行MenuSettingTest項目,模擬器顯示如圖13.56所示。
140955_1cel_262659.jpg


           圖13.56 菜單設置界面
觸碰「播放背景音樂」菜單項時,會播放背景音樂;觸碰「設置」菜單項時,會切換到背景音樂設置場景,模擬器顯示如圖13.57所示。
141029_yJfJ_262659.jpg
        圖13.57 背景音樂設置場景

背景音樂的默認狀態是「開」,觸碰「開」菜單項切換音樂開關,背景音樂狀態轉換成「關」。此時觸碰「返回主菜單」菜單項,再觸碰「播放背景音樂」菜單項時,不會再播放背景音樂了。
這樣,咱們就完成了一個簡單的聲音設置功能。後面咱們會將這個功能整合到遊戲當中。
框架

相關文章
相關標籤/搜索