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 (静音)属性来切换开关。
单击“ Run ”按钮执行 MenuSettingTest 项目,模拟器显示如图 13.56 所示。
图 13.56 菜单设置界面
触碰“播放背景音乐”菜单项时,会播放背景音乐;触碰“设置”菜单项时,会切换到背景音乐设置场景,模拟器显示如图 13.57 所示。
图 13.57 背景音乐设置场景
背景音乐的默认状态是“开”,触碰“开”菜单项切换音乐开关,背景音乐状态转换成“关”。此时触碰“返回主菜单”菜单项,再触碰“播放背景音乐”菜单项时,不会再播放背景音乐了。
这样,我们就完成了一个简单的声音设置功能。后面我们会将这个功能整合到游戏当中。
本文转自
fkJava李刚 51CTO博客,原文链接:http://blog.51cto.com/javaligang/1396487 ,如需转载请自行联系原作者