重复一个实例中的声音

本文关键字:实例 声音 一个 | 更新日期: 2023-09-27 18:21:23

我一直在读关于将声音编程到c#XNA游戏中的不同方法。我已经决定使用一个声音实例来控制音量,但在播放.wav时,我意识到声音只有在完成后才会再次播放,而如果被要求,只使用sound Effect.play()(而不是实例)会导致它播放自己的多个副本。所以我的问题是,在按下按钮将导致单个音效同时播放多次的场景中(例如机枪的重复嗡嗡声等),而不是等到声音文件结束才循环;您将如何使用实例?我认为我缺少了一些东西,或者实例不是为这种用途而设计的。如果是,音效的基本选项和音效实例的基本选项之间的主要区别是什么?提前谢谢。

重复一个实例中的声音

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; }
    }
}

使用此方法,您必须为每个Sound的每个帧调用Update(),所以请将它们的集合保存在某个位置,或者使它们可以访问。