如何在picturebox移动时始终播放声音C#
我想在picturebox使用keydown事件移动时一直播放声音。我的代码是:如何在picturebox移动时始终播放声音C#,c#,.net,winforms,C#,.net,Winforms,我想在picturebox使用keydown事件移动时一直播放声音。我的代码是: private bool soundPlaying = false; private SoundPlayer player = new SoundPlayer(@"Sounds/Step.wav"); private void PlaySound(bool start) { if (start) { if
private bool soundPlaying = false;
private SoundPlayer player = new SoundPlayer(@"Sounds/Step.wav");
private void PlaySound(bool start)
{
if (start)
{
if (!soundPlaying)
{
soundPlaying = true;
player.PlayLooping();
}
}
else
{
soundPlaying = false;
player.Stop();
}
}
private void Joc_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.W)
{
PlaySound(true);
}
}
private void Joc_KeyDown(object sender, KeyEventArgs e)
{
Joc joc = new Joc();
if (e.KeyCode == Keys.W)
{
joc.keyPressW(velocity, gameboard, ColonistList, StoneListMain, treeList, treeFHD, treeHD, stoneFHD, stoneHD, stoneLooted, killedMob, Ship, Wolf, Distance, inventoryButton, openInventory, LifeBarStroke, InnerLifeBar, WolfHealthStroke);
PlaySound(false);
}
else if (e.KeyCode == Keys.S) joc.keyPressS(velocity, gameboard, ColonistList, StoneListMain, treeList, smallStoneList, treeFHD, treeHD, stoneFHD, stoneHD, stoneLooted, killedMob, Ship, Wolf, Distance, inventoryButton, openInventory, LifeBarStroke, InnerLifeBar, WolfHealthStroke);
else if (e.KeyCode == Keys.D) joc.keyPressD(velocity, gameboard, ColonistList, StoneListMain, treeList, smallStoneList, treeFHD, treeHD, stoneFHD, stoneHD, stoneLooted, killedMob, Ship, Wolf, Distance, inventoryButton, openInventory, LifeBarStroke, InnerLifeBar, WolfHealthStroke);
else if (e.KeyCode == Keys.A) joc.keyPressA(velocity, gameboard, ColonistList, StoneListMain, treeList, smallStoneList, treeFHD, treeHD, stoneFHD, stoneHD, stoneLooted, killedMob, Ship, Wolf, Distance, inventoryButton, openInventory, LifeBarStroke, InnerLifeBar, WolfHealthStroke);
}
在“Joc”类中有行走功能。在这一刻,这段代码在我移动第一个像素时播放一次声音,当我停止按键时,它再次播放声音。如何解决此问题?首先,让我们了解如何播放声音。
这很简单,对吧?如上所述,您需要调用
player.Play()代码>
但这是否意味着声音将持续播放?答案是不会的
如何在picturebox移动时始终播放声音C#
那么,如何让声音反复播放直到我们想要停止它?
要实现这一点,您需要使用方法,但在此之前,我的建议是不要在timer1\u Tick
创建类字段中实例化sound player对象
现在,让我们保持非常简单,只要按下键,你就想播放声音,或者换一种方式,直到你不松开按钮,对吗
在这里,您需要做两件事:
在KeyDown
或KeyPress
上调用player.PlayLooping
调用类似于player.Stop()
调用KeyUp
事件的方法
在大多数系统中,当您按下一个键时,您将开始得到。因此,您将获得很多很多按键事件…并且您将多次调用PlayLooping()
。这将导致它每次重置,导致声音起伏,或者重置得太快,以至于看起来好像根本没有播放
要解决此问题,请设置一个跟踪声音是否已播放的布尔值,以便只调用一次PlayLooping()
。您可能还应该将SoundPlayer
实例移出到类级别,因为不需要每次都重新加载它。因此,在keydown上我们称为PlaySound(true)
,而在keydup上我们称为PlaySound(false)
,如下所示(为了清晰起见,简化了代码):
它在某种程度上起作用。它在我走完后播放。你能帮我吗?我们得看看你的更新代码才能弄清楚。你不是还在用计时器吧?我们的想法是,您在keydown事件中启动声音,在keydup事件中停止声音。很高兴您能找到答案。看起来你有对错颠倒。
private bool soundPlaying = false;
private SoundPlayer player = new SoundPlayer(@"Sounds/Step.wav");
private void Joc_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.W)
{
PlaySound(true);
}
}
private void PlaySound(bool start)
{
if (start)
{
if (!soundPlaying)
{
soundPlaying = true;
player.PlayLooping();
}
}
else
{
soundPlaying = false;
player.Stop();
}
}
private void Joc_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.W)
{
PlaySound(false);
}
}