2012-01-24 32 views
1

我一直在阅读有关将声音编程到c#XNA游戏中的不同方式。我已经决定为音量控制使用声音实例,但在播放.wav时,我意识到声音只会在完成后才会播放,而使用Sound Effect .Play()(而不是实例)将导致它播放自己的多个副本,如果它被要求。所以我的问题是,在按下一个按钮的情况下,会导致一次播放多个声音效果(例如机枪或类似的重复无人机),而不是等到声音文件结束循环;你将如何使用一个实例?我假设有一些我错过了,或者一个实例不是为这个用途而设计的。如果是这样,Sound Effect的基本选项与Sound Effect Instance的主要区别是什么?提前致谢。从一个实例重复声音

回答

4

A SoundEffectInstance是声音播放的单个实例;根据定义,它不能一次播放超过一个。当然,你可以有多个相同的实例SoundEffect。实际上,这基本上是当您拨打SoundEffect.Play()时发生的情况:您正在创建实例并播放它。

记住这一点,你的盘子上有几个选项。如果[假定]想要在按住按钮时阻止十亿个声音完全播放,那么肯定不应该使用SoundEffect.Play(),就像您发现的一样,将会创建许多许多实例(这可能对性能非常不利和总体管理)。对于频率较低的声音来说,这可能是一种好方法。

话虽如此,SoundEffectInstance可以用什么方式?基本上它可以从头开始重新启动。请注意,您当然可以拥有多个SoundEffectInstance,每个游戏组件包含一个(或多个)组件。通过这种方式,你的一把枪可以重新启动,而不会混淆不同枪的相同声音。或者出于性能原因,您可以选择每个音效只有一个实例。

我有问题,尝试重新启动“简单”的方式:

instance.Stop(); 
instance.Play(); 

历史上,这并没有为我工作;如果它为你做,不考虑以下内容:

我所要做的是为每个实例设置我自己的“重新启动”标志。所以我包裹SoundEffectInstance类用我自己的,像这样:

//class that represents one sound effect instance PLUS restart flag 
public class Sound 
{ 
    SoundEffectInstance instance; 
    bool restart; 

    public Sound(SoundEffectInstance i) 
    { 
     instance = i; 
     restart = false; 
    } 

    public bool PlayingOrRestarting() 
    { 
     return State == SoundState.Playing || restart; 
    } 

    public void Update() 
    { 
     if (restart) 
     { 
      instance.Play(); 
      restart = false; 
     } 
    } 

    public void Play() 
    { 
     instance.Play(); 
    } 

    public void Restart() 
    { 
     instance.Stop(); 
     restart = true; 
    } 

    public void Stop() 
    { 
     instance.Stop(); 
     restart = false; 
    } 

    public SoundState State 
    { 
     get { return instance.State; } 
    } 

    public float Volume 
    { 
     set { instance.Volume = value; } 
     get { return instance.Volume; } 
    } 

    public bool IsLooped 
    { 
     set { instance.IsLooped = value; } 
     get { return instance.IsLooped; } 
    } 
} 

使用这种方法,你必须调用Update()为每Sound每一帧,所以要收集他们的地方,或者让他们以其他方式使用。

+0

谢谢,这完全清除了我的查询。 – GamersIncoming