簡體   English   中英

如何在圖片框移動時一直播放聲音 C#

[英]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正在調用,您就想播放聲音,或者讓我們說另一種方式,直到您不釋放按鈕,對吧?


你需要做兩件事:

  1. KeyDownKeyPress上調用player.PlayLooping
  2. 調用SoundPlayer.Stop()方法,就像在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM