189 8069 5689

疯狂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所示。疯狂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
 -(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所示。
疯狂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
 -(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所示。
疯狂ios之cocos2d中的声音

      图13.56 菜单设置界面
触碰“播放背景音乐”菜单项时,会播放背景音乐;触碰“设置”菜单项时,会切换到背景音乐设置场景,模拟器显示如图13.57所示。
疯狂ios之cocos2d中的声音
    图13.57 背景音乐设置场景

背景音乐的默认状态是“开”,触碰“开”菜单项切换音乐开关,背景音乐状态转换成“关”。此时触碰“返回主菜单”菜单项,再触碰“播放背景音乐”菜单项时,不会再播放背景音乐了。
这样,我们就完成了一个简单的声音设置功能。后面我们会将这个功能整合到游戏当中。

10年积累的成都网站制作、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有盱眙免费网站建设让你可以放心的选择与我们合作。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻标题:疯狂ios之cocos2d中的声音-创新互联
文章来源:http://cdxtjz.cn/article/dgceei.html

其他资讯