问题

你想有一个快速播放音效的方法。

解决方案

在XNA3.0中,你可以直接从XNA中加载和播放声音,而无需使用Xact加载它们。虽然这个方法移除了一些Xact的高级功能,但可以让播放音效变得非常容易。

工作原理

首先在项目中添加音效文件,方法与在项目中添加一张图像是一样的,可参见教程3-1。最简单的方法是将一个.wav文件拖动到解决方案的Content文件夹上。

将.wav文件添加到项目中之后,在代码顶部声明一个SoundEffect变量,它将链接到之后的音效文件:

SoundEffect myEffect; 

在LoadContent方法中,添加以下代码加载一个.wav文件:

myEffect=Content.Load<SoundEffect>(“effect”); 

当你想播放声音时,可以使用以下代码:

myEffect.Play(); 
SoundEffect.Play()重载方法

SoundEffect.Play()方法有很多重载方法,可以提供更多的控制。最复杂的重载方法有四个参数:

  • 第一个参数volume让你可以控制音量,范围值在0.0f到1.0f之间,1.0f对应设置在SoundEffect.MasterVolumn,这个值也在0.0f和1.0f之间,1.0f对应系统音量(可在Windows系统工具栏的扬声器图标中看到)。
  • 第二个参数pitch是音高(速度),音高的数值范围是-1.0到1.0之间的浮点数,负值表示播放速度变慢,正值变快,0.0表示正常速度。注意这可以用来产生一个声音的不同版本:散弹枪和手枪使用相同的声音效果,但音高不同。
  • 第三个参数pan是声道,输入的数值范围是-1.0到1.0之间的浮点数,-1.0表示只通过左声道播放,1.0表示只通过右声道,正值表示右声道的音量比左声道大。
  • 最后一个参数loop让你可以设定是否循环,输入的是布尔值,1代表true,也就是声音播放完之后会自动再播放一次,而0代表false,即代表着声音播放完之后就不会再播放了,可见下面的章节学习如何防止一个声音循环播放。
控制音效

前面的代码已经足以播放音效了,但XNA还提供了SoundEffectInstance类,你可以使用这个类暂停或停止音效,改变音量等,首先要在代码顶部添加一个变量:

SoundEffectInstance myEffectInstance; 

当调用SoundEffectInstance的Play方法时,SoundEffect对象会自动转换为一个SoundEffectInstance对象。

现在你可以访问SoundEffectInstance对象,你可以使用这个对象改变音高和音量或者检查它是否已经停止播放:

if (myEffectInstance != null) 
{
    myEffectInstance.Volume *= 0.9f; 
    
    if (myEffectInstance.State == SoundState.Stopped) 
    {
        myEffectInstance.Dispose(); 
        myEffectInstance = null; 
    }
} 

这个代码会持续地降低音量,当停止播放时会移除对这个对象的引用。

注意:Zune可以同时播放16个SoundEffectInstance,但加载的SoundEffectInstance数量没有限制。Xbox360可以同时播放300个SoundEffectInstance,但一次只能加载300个SoundEffectInstance。在PC上没有限制。但提醒一点,在写本书的时候,SoundEffectInstance.Play方法有一个bug,它会在使用SoundEffectInstance.Resume方法时被忽略。