我有这个:
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。
谢谢。
答案 0 :(得分:1)
SoundPlayer真的很黯淡,但这就是.NET 2.0所带来的。尝试使用我的播放器(基于this article),它使用MCI播放声音:
您可以使用其他音频编解码器(例如MP3),并且您只需加载一次文件(而不是每次攻击时都会加载,这会导致延迟)。并且您可以异步播放声音而无需创建其他线程。
它非常易于使用。只需创建一个新的QueuedSamplesPlayer
,其中包含您要识别声音的通用参数(例如enum
,string
或int
)。使用AddSample
方法在启动时加载所有声音。然后使用Play
或PlayAsync
分别同步或异步播放文件。
您可以多次拨打PlayAsync
,声音会按顺序播放,一个接一个播放(不会阻止您当前的话题)。您甚至可以在播放声音时拨打PlayAsync
,然后将其添加到要播放的声音队列中。当所有声音播放完毕后,将引发QueueEmpty事件。
此播放器已在Windows XP,Vista和7上进行过测试。