疯狂ios之cocos2d中的声音
生活随笔
收集整理的這篇文章主要介紹了
疯狂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類先要做一些準備工作,步驟如下。
使用cocos2d模板新建一個項目,命名為“SimpleAudioEngineTest”。在Xcode 4之后會在項目中默認加入OpenAL、AudioToolbox和AVFoundation框架,我們可以展開“Build Phases”下面的“Link Binary With Libraries”查看,如圖13.54所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖[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?
?-(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所示。
? ? ? ? ? ? ?圖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方法之后添加playBackgroundMusic和setting方法,代碼如下(程序清單同上):
?//?播放背景音樂的方法
?-(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方法之后添加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{?
? 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所示。
? ? ? ? ? ?圖13.56?菜單設置界面
觸碰“播放背景音樂”菜單項時,會播放背景音樂;觸碰“設置”菜單項時,會切換到背景音樂設置場景,模擬器顯示如圖13.57所示。
? ? ? ? 圖13.57?背景音樂設置場景
背景音樂的默認狀態是“開”,觸碰“開”菜單項切換音樂開關,背景音樂狀態轉換成“關”。此時觸碰“返回主菜單”菜單項,再觸碰“播放背景音樂”菜單項時,不會再播放背景音樂了。
任何一個游戲中都不能缺少音樂和音效,蘋果公司在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類先要做一些準備工作,步驟如下。
使用cocos2d模板新建一個項目,命名為“SimpleAudioEngineTest”。在Xcode 4之后會在項目中默認加入OpenAL、AudioToolbox和AVFoundation框架,我們可以展開“Build Phases”下面的“Link Binary With Libraries”查看,如圖13.54所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖[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?
?-(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所示。
? ? ? ? ? ? ?圖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方法之后添加playBackgroundMusic和setting方法,代碼如下(程序清單同上):
?//?播放背景音樂的方法
?-(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方法之后添加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{?
? 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所示。
? ? ? ? ? ?圖13.56?菜單設置界面
觸碰“播放背景音樂”菜單項時,會播放背景音樂;觸碰“設置”菜單項時,會切換到背景音樂設置場景,模擬器顯示如圖13.57所示。
? ? ? ? 圖13.57?背景音樂設置場景
背景音樂的默認狀態是“開”,觸碰“開”菜單項切換音樂開關,背景音樂狀態轉換成“關”。此時觸碰“返回主菜單”菜單項,再觸碰“播放背景音樂”菜單項時,不會再播放背景音樂了。
這樣,我們就完成了一個簡單的聲音設置功能。后面我們會將這個功能整合到游戲當中。
?
本文轉自?
fkJava李剛?51CTO博客,原文鏈接:http://blog.51cto.com/javaligang/1396487?,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的疯狂ios之cocos2d中的声音的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring的任务调度和邮件发送
- 下一篇: 移动端图片上传方法【更好的兼容安卓IOS