【问题标题】:C# Text Adventure Music IssueC#文本冒险音乐问题
【发布时间】:2016-10-15 16:29:34
【问题描述】:

对于学校,我必须进行文字冒险,而我刚刚创建了菜单。现在我想在菜单中播放背景音乐,我已经知道怎么做。但是,问题是,例如,当我进入选项菜单时,音乐停止播放。我想让音乐持续播放直到按下“开始”按钮。

这是我的菜单代码:

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) 在您转到子菜单时播放一小段声音。

我将我的代码更改为这个,因为显然 play 函数会自动为您创建一个新线程,而不必自己做。不过,音乐仍然不会在整个菜单中持续播放。

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();

    }

【问题讨论】:

  • 看起来你有太多的 'new SoundPlayer` 和 Play 语句。根据文档,您只需要一个 SoundPlayer 对象。当您需要播放声音时,调用Stop方法,设置所需的SoundLocation并调用Play或PlayLooping方法(它们都使用单独的线程)。
  • 我创建了一个新线程来播放声音,但是播放函数已经自己创建了一个新线程,不是吗?那么我必须在哪里放置播放功能才能让它在整个菜单中播放?

标签: c# audio text adventure


【解决方案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 Player 的库可以在 COM 组件中找到,如果需要手动添加,可以在 windows\system32 中找到。

另外,请注意该库是为 .Net 框架 4 编写的,因此请确保在属性中项目使用框架 4 作为目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多