3

我有这个:

ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);

和 FireAttackProc:

    private void FireAttackProc(Object stateInfo)
    {
        // Process Attack/Fire (local)
        lock (_procLock)
        {
            // build status message
            String status = "(Away vs. Home)";

            // get Fire Result state info
            FireResult fireResult = (FireResult)stateInfo;

            // update home grid with attack information
            GameModel.HomeCellStatusSet(fireResult.FireGridLocation, Cell.cellState.Lock);
            this.Invoke(new Action(delegate() { RefreshHomeGrid(); }));

            status = status + "(Attack Coordinate: (" + GameModel.alphaCoords(fireResult.FireGridLocation.Column) +
                "," + fireResult.FireGridLocation.Row + "))(Result: ";

            // play audio data if true
            if (audio)
            {
                String Letters;

                Stream stream;
                SoundPlayer player;

                Letters = GameModel.alphaCoords(fireResult.FireGridLocation.Column);
                stream = Properties.Resources.ResourceManager.GetStream("_" + Letters);
                player = new System.Media.SoundPlayer(stream);
                player.PlaySync();


                Letters = fireResult.FireGridLocation.Row.ToString();
                stream = Properties.Resources.ResourceManager.GetStream("__" + Letters);
                player = new System.Media.SoundPlayer(stream);
                player.PlaySync();

                stream.Dispose();
                player.Dispose();
            }

            if (audio)
            {
                SoundPlayer fire = new SoundPlayer(Properties.Resources.fire);
                fire.PlaySync();
                fire.Dispose();
            }

            // deal with hit/miss
            switch (fireResult.Hit)
            {
                case true:
                    this.Invoke(new Action(delegate()
                    {
                        GameModel.HomeCellStatusSet(fireResult.FireGridLocation, Cell.cellState.Hit);
                        status = status + "(Hit)";
                    }));

                    if (audio)
                    {
                        SoundPlayer hit = new SoundPlayer(Properties.Resources.firehit);
                        hit.PlaySync();
                        hit.Dispose();

                    }
                    break;

                case false:
                    this.Invoke(new Action(delegate() 
                    {
                        GameModel.HomeCellStatusSet(fireResult.FireGridLocation, Cell.cellState.Miss);
                        status = status + "(Miss)";
                    }));

                    GameModel.PlayerNextTurn = NietzscheBattleshipsGameModel.GamePlayers.Home;

                    if (audio)
                    {
                        SoundPlayer miss = new SoundPlayer(Properties.Resources.firemiss);
                        miss.PlaySync();
                        miss.Dispose();
                    }
                    break;
            }

            // refresh home grid with updated data
            this.Invoke(new Action(delegate() { RefreshHomeGrid(); }));

            GameToolStripStatusLabel.Text = status + ")";

            // deal with ship destroyed
            if (fireResult.ShipDestroyed)
            {
                status = status + "(Destroyed: " + GameModel.getShipDescription(fireResult.DestroyedShipType) + ")";

                if (audio)
                {
                    Stream stream;
                    SoundPlayer player;

                    stream = Properties.Resources.ResourceManager.GetStream("_home");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                    stream.Dispose();

                    string ShipID = fireResult.DestroyedShipType.ToString();
                    stream = Properties.Resources.ResourceManager.GetStream("_" + ShipID);
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                    stream.Dispose();

                    stream = Properties.Resources.ResourceManager.GetStream("_destroyed");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                    stream.Dispose();
                }
            }

            // deal with win condition
            if (fireResult.Win)
            {
                if (audio)
                {
                    Stream stream;
                    SoundPlayer player;

                    stream = Properties.Resources.ResourceManager.GetStream("_home");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();

                    stream = Properties.Resources.ResourceManager.GetStream("_loses");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                }

                GameModel.gameContracts = new GameContracts();
            }

            // update status message
            if (fireResult.Hit)
            {
                if (!fireResult.Win)
                {
                    status = status + "(Turn: Away)";

                    LockGUIControls();
                }
            }

            // deal with turn logic
            if (GameModel.PlayerNextTurn == NietzscheBattleshipsGameModel.GamePlayers.Home)
            {
                this.Invoke(new Action(delegate()
                {
                    if (!fireResult.Win)
                    {
                        status = status + "(Turn: Home)";

                        AwayTableLayoutPanel.Enabled = true;
                    }
                }));
            }

            // deal with win condition
            if (fireResult.Win)
            {
                this.Invoke(new Action(delegate()
                {
                    status = status + "(Game: Home Loses)";

                    CancelToolStripMenuItem.Enabled = false;
                    NewToolStripMenuItem.Enabled = true;
                    LockGUIControls();
                }));
            }

            // display completed status message
            GameToolStripStatusLabel.Text = status + ")";
        }
    }

问题是这样的:

在 Vista/win7 下播放 FireAttackProc 中的声音片段。

但在 XP 下,FireAttackProc 中包含的逻辑被执行,但没有声音片段播放。

有没有快速的解决方案,所以声音会在 XP 下播放?

我要求一个快速的解决方案,因为我很高兴能够在 Vista/Win7 中完全执行,但如果有一个快速的解决方案那就太好了,所以它也可以兼容 XP。

谢谢你。

4

1 回答 1

1

SoundPlayer 确实很乏味,但这就是 .NET 2.0 的全部功能。试试我的播放器(基于这篇文章),它使用 MCI 播放声音:

http://pastebin.com/aVDWBJ45

您可以使用其他音频编解码器(例如 MP3),并且您只需加载文件一次(而不是每次攻击时都加载,这会导致延迟)。您可以异步播放声音而无需创建额外的线程。

它真的很容易使用。只需使用QueuedSamplesPlayer您想要识别声音的任何通用参数(例如 an enum、 astring或 an int)创建一个新的。使用该AddSample方法在启动时加载所有声音。然后分别使用PlayPlayAsync同步或异步播放文件。

您可以PlayAsync多次调用,声音将依次播放(不阻塞当前线程)。您甚至可以PlayAsync在播放声音时调用,它会被添加到要播放的声音队列中。当所有声音播放完毕后,将引发 QueueEmpty 事件。

此播放器已在 Windows XP、Vista 和 7 上进行了测试。

于 2010-04-26T08:29:56.793 回答