如何在picturebox移动时始终播放声音C#

如何在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

我想在picturebox使用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);
    }

在“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);
        }
    }