[英]How to play a sound all the time while a picturebox is moving C#
我想在使用 keydown 事件移動圖片框時一直播放聲音。 我的代碼是這樣的:
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);
}
class 中的“Joc”是步行功能。 在這一刻,當我走過第一個像素時,這段代碼會播放一次聲音,當我停止按鍵時,它會再次播放聲音。 我怎么解決這個問題?
首先,讓我們了解一下我們是如何播放聲音的。
這很簡單,對吧? 正如你上面寫的,你需要調用player.Play();
.
但這是否意味着聲音會連續播放? 答案是否定的,它不會。
如何在圖片框移動時一直播放聲音 C#
那么如何讓聲音反復播放直到我們想要停止呢?
要做到這一點,您需要使用SoundPlayer.PlayLooping()方法,但在此之前,我的建議是不要在 timer1_Tick 中實例化聲音播放器 object, timer1_Tick
創建一個 class 字段。
現在,讓我們保持非常簡單,只要KeyDown
正在調用,您就想播放聲音,或者讓我們說另一種方式,直到您不釋放按鈕,對吧?
你需要做兩件事:
KeyDown
或KeyPress
上調用player.PlayLooping
。KeyUp
事件上調用 player.Stop player.Stop()
) 一樣。 在大多數系統上,當您按住某個鍵時,會在一小段延遲后開始重復擊鍵。 所以你會得到很多很多 keydown 事件......你最終也會多次調用PlayLooping()
。 這將導致它每次都重置,導致聲音斷斷續續,或者它可能重置得太快以至於看起來好像根本沒有播放。
為了解決這個問題,設置一個 boolean 來跟蹤聲音是否已經在播放,這樣你就只調用PlayLooping()
一次。 您可能還應該將您的SoundPlayer
實例移到 class 級別,因為無需每次都重新加載它。 所以在 keydown 我們調用PlaySound(true)
,而在 keyup 我們調用PlaySound(false)
,如下所示(為了清楚起見,簡化代碼):
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.