XNA 技术资源 - SoundEffect API在XNA Game Studio 3.1中的更改
本文由Johnson.Song@live.cn于七楼顶上http://www.qilouding.cn原创发布,请勿转载,如需转载,请与本人联系。
本英语原文由ashtat于Monday, June 15, 2009 6:13 PM发布于其博客
译文如下:
SoundEffect API在XNA Game Studio 3.1中的更改
Shawn在他的博客发布了一篇很棒的文章SoundEffect在XNA Game Studio 3.1中的更改。本文的帮助内容是关于SoundEffect API的,例如:如果你尝试去移植你的3.0代码到新发布的版本。
“Fire and Forget”播放方案
SoundEffect.Play方法现在专门为“Fire and Forget”声音播放方案使用。它不再返回一个SoundEffectInstance(音效实例),而是返回一个布尔值 - “true”,如果播放失败就是“false”并抛出异常InstancePlayLimitException。XNA框架处理这些声音直到它们完成播放。
// 这样将播放一个2D的“Fire and Forget”音效,使用默认的音量、音高、相位
SoundEffect effect = Content.Load<SoundEffect>("GameSoundEffect");
bool effectPlayed = effect.Play();
// 这样将播放一个2D的“Fire and Forget”音效,使用指定的音量、音高、相位
bool effectPlayed = effect.Play(0.8f, 1.0f, 0.0f);
你只能使用“Fire and Forget”机制去播放2D声音,并且不能进行循环播放。
“Create, Configure and Play”方案
SoundEffect.CreateInstance方法返回一个SoundEffectInstance(音效实例)对象。游戏要在音效实例存在时完全掌控它。换句话说,就是在播放完成后,在返回方法前,你需要调用Dispose方法注销这个音效实例。它的使用模式如下:
1.调用SoundEffect.CreateInstance创建一个SoundEffectInstance。
2.配置SoundEffectInstance,为它设置所有的属性。
3.调用SoundEffectInstance.Play,进行播放。
4.当播放完成时,调用SoundEffectInstance.Dispose注销实例。
// 这样在游戏里控制存在的音乐效果实例
SoundEffect effect = Content.Load< SoundEffect>("GameSoundEffect");
SoundEffectInstance instance = effect.CreateInstance();
instance.Play();
…
instance.Dispose();
SoundEffect.Play3D方法全部过时失效了。更改为,游戏现在可以配置SoundEffectInstance(音效实例)对象,在播放前使用SoundEffect.CreateInstance方法设置2D/3D位置和循环播放。
创建一个全部默认的音效实例,如2D非循环音效。实例如下:
// 这样将播放一个2D非循环音效
SoundEffect effect = Content.Load<SoundEffect>("GameSoundEffect");
SoundEffectInstance instance = effect.CreateInstance();
instance.Play();
调用Apply3D在一个SoundEffectInstance上,在Play(播放)前配置它,如一个3D定位声音。实例如下:
// 这样将播放一个3D定位的非循环音效
SoundEffect effect = Content.Load<SoundEffect>("GameSoundEffect");
SoundEffectInstance instance = effect.CreateInstance();
instance.Apply3D(listener, emitter);
instance.Play();
设置“IsLooped(确定循环)”属性,在Play(播放)调用前配置实例,如一个循环音效。实例如下:
// 这样将播放一个2D循环音效
SoundEffect effect = Content.Load<SoundEffect>("GameSoundEffect");
SoundEffectInstance instance = effect.CreateInstance();
instance.IsLooped = true;
instance.Play();
// 这样将播放一个3D定位循环音效
SoundEffect effect = Content.Load<SoundEffect>(“GameSoundEffect”);
SoundEffectInstance instance = effect.CreateInstance();
instance.IsLooped = true;
instance.Apply3D(listener, emitter);
instance.Play();
如果你要同时应用Pan(声像)和Apply3D(为什么你要这么干?),如这个声音配置是一个2D或3D定位。调用实例如下:
// 这样将播放一个2D定位循环音效。
// 这种情况下设置Pan重写Apply3D。
SoundEffect effect = Content.Load<SoundEffect>("GameSoundEffect");
SoundEffectInstance instance = effect.CreateInstance();
instance.IsLooped = true;
instance.Apply3D(listener, emitter);
instance.Pan = 1.0f;
instance.Play();
扩展辅助类
这有个辅助类,能帮助你减轻移植代码到新环境中的痛苦。但请记住,这是一个“Create and Configure”播放方案的辅助类,因此在完成播放时,你仍然必须确认,你有注销音效实例。
using Microsoft.Xna.Framework.Audio;
public static class SoundEffectExtensions
{
public static SoundEffectInstance Play3D(
this SoundEffect effect,
AudioListener listener,
AudioEmitter emitter)
{
return Play3D(effect,
listener,
emitter,
1f,
0f,
false);
}
public static SoundEffectInstance Play3D(
this SoundEffect effect,
AudioListener listener,
AudioEmitter emitter,
float volume,
float pitch,
bool loop)
{
return Play3D(
effect,
new AudioListener[]
{
listener
},
emitter,
volume,
pitch,
loop);
}
public static SoundEffectInstance Play3D(
this SoundEffect effect,
AudioListener[] listeners,
AudioEmitter emitter,
float volume,
float pitch,
bool loop)
{
SoundEffectInstance instance = effect.CreateInstance();
instance.Volume = volume;
instance.Pitch = pitch;
instance.IsLooped = loop;
instance.Apply3D(listeners, emitter);
instance.Play();
return instance;
}
public static SoundEffectInstance Play2D(
this SoundEffect effect)
{
return Play2D(effect, 1f, 0f, 0f, false);
}
public static SoundEffectInstance Play2D(
this SoundEffect effect,
float volume)
{
return Play2D(effect, volume, 0f, 0f, false);
}
public static SoundEffectInstance Play2D(
this SoundEffect effect,
float volume,
float pitch,
float pan,
bool loop)
{
SoundEffectInstance instance = effect.CreateInstance();
instance.Volume = volume;
instance.Pitch = pitch;
instance.Pan = pan;
instance.IsLooped = loop;
instance.Play();
return instance;
}
}
(译文完)
相关名词解释:
Volume:音量。
Pan:声像,声音在空间上的定位。
Pitch:音高,通常1表示一个半音。
Fire and Forget:这个词组最早来自于老外的武器系统,所谓“发射后不管”、“射后不理”。就是导弹啊什么的,发射以后就不用再去指挥、控制和操作了。比如什么卫星制导武器啊,声纳制导武器啊。也就相当于我们成语里的一劳永逸。原作者在文中,是指我们声音播放后,就不用管了,系统就自动为你进行后续处理了,主要就是说的垃圾回收机制。
Create, Configure and Play:就是指你需要根据对象的更改来进行相应的声音播放(改变音量和音高、应用3D设置、暂停或恢复播放等)
SoundEffectInstance:音效实例对象,提供一个播放、暂停、停止的SoundEffect声音实例。详见MSDN:SoundEffectInstance
更多关于SoundEffect的3.1的更新内容请参考SoundEffect在XNA Game Studio 3.1中的更改。
祝,阅读愉快,好心情!
作者:Johnson.Song@live.cn
日期:2009.6.19
网站:七楼顶上 http://www.qilouding.cn
声明:本文系原创文章,请勿转载,如需转载,请与本人联系。如有错漏遗失,或不同意见,请留言指正说明。
相关内容
评论
发表新留言
按照内容分类或文档日期查找选择