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 месяца:)
Любая помощь будет оценена
С уважением, Стейн
редактировать
Так что я, чтобы уточнить вещи. Есть 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:\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();
}
1 ответ
Не уверен, что вы это исправили, но вам стоит заглянуть в библиотеку Windows Media Player "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, поэтому убедитесь, что в свойствах проекта используется Framework 4 в качестве цели.