Проблема с текстовой приключенческой музыкой на C #

#c# #audio #text #adventure

#c# #Аудио #текст #Приключения

Вопрос:

Для школы мне нужно создать текстовое приключение, и я только что создал меню. Теперь я хочу, чтобы в меню была фоновая музыка, и я вроде как понял, как это сделать. Проблема, однако, в том, что, когда я, например, захожу в меню опций, музыка перестает воспроизводиться. Я хочу, чтобы музыка непрерывно воспроизводилась до тех пор, пока не будет нажата кнопка «Пуск».

Вот мой код меню:

 class Program
{
    static string Playername = "";
    static string CorrectIntro = "";
    static ConsoleColor TextColor = ConsoleColor.White;

    static System.Threading.Thread MusicPlayer;

    private static SoundPlayer IntroMusic;
    private static SoundPlayer MenuSelector;

    public static void Main(string[] args)
    {

        MusicPlayer = new System.Threading.Thread(new System.Threading.ThreadStart(BackgroundMusic));

        //Menu Selector Sound
        MenuSelector = new System.Media.SoundPlayer();
        MenuSelector.SoundLocation = @"C:UsersstijnDesktopSchoolProgrammerenPeriode 1Text AdventureSoundsMenuSelector.wav";

        Menu();
    }

    public static void BackgroundMusic()
    {
        IntroMusic.SoundLocation = @"C:UsersstijnDesktopSchoolProgrammerenPeriode 1Text AdventureSoundsIntroMusic.wav";
        IntroMusic.Play();
    }

    private static void Menu()
    {
        IntroMusic = new System.Media.SoundPlayer();
        IntroMusic.SoundLocation = @"C:UsersstijnDesktopSchoolProgrammerenPeriode 1Text AdventureSoundsIntroMusic.wav";
        IntroMusic.Play();

        Console.ForegroundColor = TextColor;

        Zin("The story of Benedict Henderson");
        Enter('n');
        Enter('n');
        Zin("[1] Start");
        Enter('n');
        Zin("[2] Options");
        Enter('n');
        Zin("[3] Credits");
        Enter('n');
        Zin("[4] Quit");
        Enter('n');

        ConsoleKeyInfo MenuSelector = Console.ReadKey(true);

        switch (MenuSelector.Key)
        {
            case ConsoleKey.D1:
                Intro();
                break;
            case ConsoleKey.D2:
                Options();
                break;
            case ConsoleKey.D3:
                Credits();
                break;
            case ConsoleKey.D4:
                Quit();
                break;
        }

        Console.ReadKey();

    }

    //Quit function
    private static void Quit()
    {
        MenuSelector.Play();
        Environment.Exit(0);
    }

    //Credits function
    private static void Credits()
    {
        MenuSelector.Play();
        Console.Clear();

        Zin("This game is made and designed by Stijn van der Neut");
        Enter('n');
        Enter('n');
        Zin("Press enter to return to the menu");

        ConsoleKeyInfo ReturnToMenu = Console.ReadKey(true);

        if (ReturnToMenu.Key == ConsoleKey.Enter)
        {
            Console.Clear();
            Menu();
        }

    }

    //Option function
    private static void Options()
    {
        MenuSelector.Play();
        Console.Clear();



        Zin("Please select the desired text color");
        Enter('n');
        Enter('n');
        Zin("[1] White");
        Enter('n');
        Zin("[2] Red");
        Enter('n');
        Zin("[3] Blue");
        Enter('n');
        Zin("[4] Green");
        Enter('n');
        Zin("[5] Magenta");
        Enter('n');
        Zin("[6] Cyan");
        Enter('n');
        Enter('n');
        Zin("Press enter to return to the menu");

        ConsoleKeyInfo ColorSelector = Console.ReadKey(true);

        //Get player input for ColorSelector
        switch (ColorSelector.Key)
        {
            case ConsoleKey.D1:
                MenuSelector.Play();
                TextColor = ConsoleColor.White;
                break;
            case ConsoleKey.D2:
                MenuSelector.Play();
                TextColor = ConsoleColor.Red;
                break;
            case ConsoleKey.D3:
                MenuSelector.Play();
                TextColor = ConsoleColor.Blue;
                break;
            case ConsoleKey.D4:
                MenuSelector.Play();
                TextColor = ConsoleColor.Green;
                break;
            case ConsoleKey.D5:
                MenuSelector.Play();
                TextColor = ConsoleColor.Magenta;
                break;
            case ConsoleKey.D6:
                MenuSelector.Play();
                TextColor = ConsoleColor.Cyan;
                break;
            case ConsoleKey.Enter:
                MenuSelector.Play();
                Console.Clear();
                Menu();
                break;
            default:
                TextColor = ConsoleColor.Black;
                break;
        }

        Console.ForegroundColor = TextColor;
        Console.Clear();
        Menu();

    }
 

Извините за длинный блок кода, и, кстати, успокойтесь, я только начал свое обучение программированию уже 3 месяца :).

Итак, я хочу кое-что прояснить. Есть 2 объекта SoundPlayer, один из которых воспроизводит фоновую музыку, а другой (MenuSelector) воспроизводит короткий звук, когда вы переходите в подменю.

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

 class Program
{
    static string Playername = "";
    static string CorrectIntro = "";
    static ConsoleColor TextColor = ConsoleColor.White;

    private static SoundPlayer IntroMusic;
    private static SoundPlayer MenuSelector;


    public static void Main(string[] args)
    {
        //Menu Selector Sound
        MenuSelector = new System.Media.SoundPlayer();
        MenuSelector.SoundLocation = @"C:UsersstijnDesktopSchoolProgrammerenPeriode 1Text AdventureSoundsMenuSelector.wav";

        Menu();
    }

    private static void Menu()
    {
        IntroMusic = new System.Media.SoundPlayer();
        IntroMusic.SoundLocation = @"C:UsersstijnDesktopSchoolProgrammerenPeriode 1Text AdventureSoundsIntroMusic.wav";
        IntroMusic.Play();

        Console.ForegroundColor = TextColor;

        Zin("The story of Benedict Henderson");
        Enter('n');
        Enter('n');
        Zin("[1] Start");
        Enter('n');
        Zin("[2] Options");
        Enter('n');
        Zin("[3] Credits");
        Enter('n');
        Zin("[4] Quit");
        Enter('n');

        ConsoleKeyInfo MenuSelector = Console.ReadKey(true);

        switch (MenuSelector.Key)
        {
            case ConsoleKey.D1:
                Intro();
                break;
            case ConsoleKey.D2:
                Options();
                break;
            case ConsoleKey.D3:
                Credits();
                break;
            case ConsoleKey.D4:
                Quit();
                break;
        }

        Console.ReadKey();

    }

    //Quit function
    private static void Quit()
    {
        MenuSelector.Play();
        Environment.Exit(0);
    }

    //Credits function
    private static void Credits()
    {
        MenuSelector.Play();
        Console.Clear();

        Zin("This game is made and designed by Stijn van der Neut");
        Enter('n');
        Enter('n');
        Zin("Press enter to return to the menu");

        ConsoleKeyInfo ReturnToMenu = Console.ReadKey(true);

        if (ReturnToMenu.Key == ConsoleKey.Enter)
        {
            Console.Clear();
            Menu();
        }

    }

    //Option function
    private static void Options()
    {
        MenuSelector.Play();
        Console.Clear();


        Zin("Please select the desired text color");
        Enter('n');
        Enter('n');
        Zin("[1] White");
        Enter('n');
        Zin("[2] Red");
        Enter('n');
        Zin("[3] Blue");
        Enter('n');
        Zin("[4] Green");
        Enter('n');
        Zin("[5] Magenta");
        Enter('n');
        Zin("[6] Cyan");
        Enter('n');
        Enter('n');
        Zin("Press enter to return to the menu");

        ConsoleKeyInfo ColorSelector = Console.ReadKey(true);

        //Get player input for ColorSelector
        switch (ColorSelector.Key)
        {
            case ConsoleKey.D1:
                MenuSelector.Play();
                TextColor = ConsoleColor.White;
                break;
            case ConsoleKey.D2:
                MenuSelector.Play();
                TextColor = ConsoleColor.Red;
                break;
            case ConsoleKey.D3:
                MenuSelector.Play();
                TextColor = ConsoleColor.Blue;
                break;
            case ConsoleKey.D4:
                MenuSelector.Play();
                TextColor = ConsoleColor.Green;
                break;
            case ConsoleKey.D5:
                MenuSelector.Play();
                TextColor = ConsoleColor.Magenta;
                break;
            case ConsoleKey.D6:
                MenuSelector.Play();
                TextColor = ConsoleColor.Cyan;
                break;
            case ConsoleKey.Enter:
                MenuSelector.Play();
                Console.Clear();
                Menu();
                break;
            default:
                TextColor = ConsoleColor.Black;
                break;
        }

        Console.ForegroundColor = TextColor;
        Console.Clear();
        Menu();

    }
 

Комментарии:

1. Похоже, у вас слишком много «нового звукового проигрывателя» и Play операторов. Согласно документации, вам нужен только один SoundPlayer объект. Когда вам нужно воспроизвести звук, вызовите Stop метод, установите желаемый SoundLocation и вызовите Play или PlayLooping методы (они оба используют отдельный поток).

2. Я создал новый поток для воспроизведения звука, но функция воспроизведения уже создает новый поток сама по себе, не так ли? Итак, где мне нужно разместить функцию воспроизведения, чтобы она воспроизводилась по всему меню?

Ответ №1:

Не уверен, что вы это исправили, но вам следует заглянуть в библиотеку проигрывателя Windows Media «WMPLib». Вы должны иметь возможность использовать этот код:

 Using WMPlib;

private WindowsMediaPlayer player;
private string filename = $"C:[FILE LOCATION]";

public static void main(string[] args)
{
    player = new WindowsMediaPlayer();
    player.PlayStateChange  = new _WMPOCXEvents_PlayStateChangeEventHandler(Player_PlayStateChanged);
    player.URL = filename;
    PlayBackgroundMusic();
}

private void PlayBackgroundMusic()
{
    player.controls.play();
}

private void Player_PlayStateChanged(int newState)
{
    if ((WMPPlayState)newState == WMPPlayState.wmppsStopped)
    {
        PlayBackgroundMusic();
    }
}
 

Надеюсь, это поможет, если не для этого проекта, то для будущего.
Библиотеку для проигрывателя Windows Media можно найти в COM components или в windows system32, если вам нужно добавить ее вручную.

Кроме того, обратите внимание, что библиотека написана для .Net framework 4 поэтому убедитесь в свойствах, что проект использует framework 4 в качестве целевого.