Как я могу играть два звука одновременно в C # - PullRequest
0 голосов
/ 19 мая 2018

Я создаю платформенную игру с использованием C # в Visual Studio 2017. Как я могу воспроизводить два звука одновременно?

Я пробовал это: Играть два звука одновременно , но это не такt работа.

Вот код для воспроизведения музыки -

private void Bg_music()
{
    new System.Threading.Thread(() =>
    {
        var bg = new System.Windows.Media.MediaPlayer();
        bg.Open(new System.Uri(path + "Foniqz_-_Spectrum_Subdiffusion_Mix_real.wav"));
        bg.Play();
    }).Start();                        
}

Sound_0, это должно играть все время Sound_1, это должно играть только при ударе монеты, в то время какSound_0 играет

1 Ответ

0 голосов
/ 21 мая 2018

Первая проблема, которую я обнаружил в вашем коде, это то, что вы звоните Bg_music() в Timer1_Tick, что неправильно.Каждый раз, во время отметки таймера создается новый поток, который не является правильным.

Кроме того, Вы использовали var bg, область действия которого ограничена только этим методом Bg_music().Вы должны использовать MediaPlayer вместо var , и ваш MediaPlayer bg должен быть на верхнем уровне формы (Global).Это будет что-то вроде -

MediaPlayer bg;

public game_form()
{
    InitializeComponent();
    Bg_music(); //Calling the background music thread at the time user start playing the game.

    path = Directory.GetCurrentDirectory();
    path = path + "\\..\\..\\Resources\\";
    Aanet_checking();
    Translate();
    Character_checking();
}

Ваш Bg_music () будет выглядеть примерно так -

private void Bg_music()
{
    new System.Threading.Thread(() =>
    {
        bg = new System.Windows.Media.MediaPlayer();
        bg.Open(new System.Uri(path + "Foniqz_-_Spectrum_Subdiffusion_Mix_real.wav"));
        bg.Play();
    }).Start();                        
}

Это изменение определенно решит вашу проблему.

Помимоэта проблема, которую я наблюдал, это много графического мерцания.Вы должны включить Double Buffering , чтобы избавиться от этой мерцающей проблемы.Это сделает ваш игровой опыт гладким, без мерцания.

То, что делает двойная буферизация, - это создание пользовательского интерфейса в памяти сначала в фоновом режиме, а затем отображение изображения за один снимок.Это дает графический вывод без перерыва.Просто скопируйте и вставьте приведенный ниже код в форму -

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED //Enable double buffering
        return cp;
    }
}

Удачи!

...