2016-10-15 2 views
2

Итак, для школы мне нужно сделать текстовое приключение, и я только что создал меню. Теперь я хочу иметь фоновую музыку в то время как в меню, и я как бы понял, как это сделать. Проблема, однако, когда я, например, перехожу в меню опций, музыка перестает играть. Что я хочу, чтобы музыка непрерывно воспроизводилась до тех пор, пока не будет нажата кнопка «Пуск».C# Text Adventure Music Issue

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

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:\Users\stijn\Desktop\School\Programmeren\Periode 1\Text Adventure\Sounds\MenuSelector.wav"; 

     Menu(); 
    } 

    public static void BackgroundMusic() 
    { 
     IntroMusic.SoundLocation = @"C:\Users\stijn\Desktop\School\Programmeren\Periode 1\Text Adventure\Sounds\IntroMusic.wav"; 
     IntroMusic.Play(); 
    } 

    private static void Menu() 
    { 
     IntroMusic = new System.Media.SoundPlayer(); 
     IntroMusic.SoundLocation = @"C:\Users\stijn\Desktop\School\Programmeren\Periode 1\Text Adventure\Sounds\IntroMusic.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 месяцев теперь :)

Любая помощь будет оценена

уважением, Стейн

Редактировать

Поэтому я разъясняю вещи. Есть два объекта 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:\Users\stijn\Desktop\School\Programmeren\Periode 1\Text Adventure\Sounds\MenuSelector.wav"; 

     Menu(); 
    } 

    private static void Menu() 
    { 
     IntroMusic = new System.Media.SoundPlayer(); 
     IntroMusic.SoundLocation = @"C:\Users\stijn\Desktop\School\Programmeren\Periode 1\Text Adventure\Sounds\IntroMusic.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(); 

    } 
+0

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

+0

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

ответ

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-компонентах или в windows \ system32, если вам нужно вручную добавить ее.

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