Повторение звука из одного экземпляра - PullRequest
1 голос
/ 25 января 2012

Я читал о различных способах программирования звука в игре на C # XNA. Я решил использовать экземпляр звука для регуляторов громкости, но во время воспроизведения .wav я понял, что звук будет воспроизводиться снова только после его завершения, тогда как я просто использую Sound Effect .Play () (а не экземпляр) заставит его воспроизвести несколько копий самих себя, если это будет предложено. Поэтому мой вопрос заключается в том, что в случае, когда нажатие на кнопку приведет к тому, что один звуковой эффект будет проигрываться несколько раз одновременно (например, повторяющийся гул пулемета или тому подобное), вместо ожидания до конца звукового файла. зациклить; как бы вы использовали экземпляр? Я предполагаю, что я что-то упустил, или что экземпляр не предназначен для этого использования. Если да, каковы основные различия между основными параметрами звукового эффекта и экземплярами звукового эффекта? Заранее спасибо.

1 Ответ

4 голосов
/ 25 января 2012

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, поэтому храните их где-нибудь или делайте их доступными для других целей.

...