XNA游戏开发——播放音效(2)

谁说胖子不能爱 提交于 2019-12-10 01:48:14

上一篇文章已讲述了,如何简单的添加及播放音效,本篇文章将讲述音效实例。

音效实例

调用在SoundEffect对象的Play方法,提供简单的方法来播放声音,在很多情况下将会很充足。对于枪声,爆炸声,玩家成功的声音和其它各种各样的效果,这很可能都是你所需要的。

然而,在其它地方,你可能发现需要很高的控制才能超过你播放的声音。循环播放声音的能力,举例,是非常有用的,但仅由SoundEffect类提供的功能不能提供这种能力。主要的原因是我们将没有办法去阻止声音;我们不能获得一个声音ID或任何类似的值,所以一旦激活一些声音后,我们将不能告诉类哪一个应该停止播放。

在SoundEffectInstance类中可以解决这个问题。通过调用SoundEffect 对象的CreateInstance方法来创建这个实例。

SoundEffectInstance对象与SoundEffect对象非常相似,但有以下几个关键的不同之处:

1)每一个实例仅可以在一个时间内播放一个声音。多次调用Play将不会起作用。为了同时播放多个声音,使用音效实例,需要从底层音效来创建多个实例对象实例对象。

2)对象的音量,音高和平移通过使用类属性来指定,而不是设置Play方法的参数。在声音开始播放后,也允许简单的修改其属性。

3)SoundEffectInstance对象包含一个IsLooped属性,当它设置为ture时来通知循环播放声音。

4)除了Play方法之外,效果实例也提供暂停和停止播放声音的方法。当声音没有循环播放时,它们根本不必去使用,但如果它循环了一个或另一个,这将非常有用来停止正在播放的声音。暂停将记住已播放声音的进度并将在下一次播放前恢复并从当前点开始播放。为了找出是否音效实例是否是停止的、暂停的或正播放中,可以查询它的State属性。

此外,如果当声音播放时,你左右来回滑动你的手指,声音的音高将立刻改变。再次,仅SoundEffectInstance允许作出这个改变,因为仅SoundEffect对象允许当声音首先开始回放时,设置音高(音量和平移也是相同的)

下面代码将描述播放,重调音高和暂停声音。

TouchCollection tc  = TouchPanel.GetState();
if (tc.Count > 0)
{
    // Find  the  region   of  the  screen  that has been touched
    screenRegion  = (int)(tc[0].Position.Y * 4 / Window.ClientBounds.Height);
    // Ensure we  have a region   between 0 and 3
    if (screenRegion  >= 0 &&  screenRegion  <= 3)
    {
        // What type  of  touch  event  do we  have?
        switch   (tc[0].State)
        {
            case TouchLocationState.Pressed:
                // Set  the  pitch based on the  horizontal touch  position
                _soundInstances[screenRegion].Pitch  = (tc[0].Position.X / this.Window.ClientBounds.Width) *  2 - 1;
 
                // Start the  sound for this region
                _soundInstances[screenRegion].Play();
                break;
            case TouchLocationState.Moved:
                // Is the  sound for this region   currently playing?
                if (_soundInstances[screenRegion].State  == SoundState.Playing)
               {
                   // Yes,  so set  the  pitch based on the  horizontal touch  position
                   _soundInstances[screenRegion].Pitch  = (tc[0].Position.X / this.Window.ClientBounds.Width) *  2 - 1;
               }
               break;
            case TouchLocationState.Released:
               // Pause all of  the  sounds
               for (int i = 0;  i < _soundInstances.Length;  i++)
               {
                   _soundInstances[i].Pause();
               }
               break;
           }
       }
}

当释放触摸点时,尝试改变代码以便它调用SoundEffectInstance对象的Stop方法二不是Pause方法。然后你将看到每次声音播放时,它都在开始时重新启动而不是恢复自上次中断的地方。

其他音效属性

我们将简略的看下,通过SoundEffect类的其它属性中暴露出来的2个属性。

第一个是Duration属性,它返回一个TimeSpan正确表明示例将多久将在它默认音高中会去播放。这个属性对于从一个声音到下一个声音都是有用的。

第二个是MasterVolume属性,它确实是一个静态属性,从SoundEffect类中调用而不是从一个实例化对象中调用。它控制随后播放或已正在播放的所有音效的总音量,所以它是很好的方式来调高或调低音量。

就像单独的声音音量,MasterVolume的设置范围在0(无声)到1(最大音量,基于当前设备的最大音量)之间。默认值是1。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!