Как воспроизводить звук все время, пока окно с картинками движется C# - PullRequest
0 голосов
/ 14 июля 2020

Я хочу воспроизводить звук все время, пока окно с картинками движется, используя событие нажатия клавиши. Мой код следующий:

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

В классе «Jo c» есть функции ходьбы. В этот момент этот код воспроизводит один раз звук, когда я прохожу первый пиксель, и когда я перестал нажимать клавишу, он снова воспроизводит звук. Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Прежде всего, давайте разберемся, как мы проигрываем звук. Все очень просто, правда? Как вы писали выше, вам нужно позвонить по номеру player.Play();. Но означает ли это, что звук будет воспроизводиться постоянно? Ответ - нет, не будет.

Как воспроизводить звук все время, пока движется окно с картинками C#

Итак, как сделать звук многократно играть, пока мы не захотим это остановить? Чтобы это произошло, вам необходимо использовать метод SoundPlayer.PlayLooping () , но перед этим я предлагаю вместо создания экземпляра объекта звукового проигрывателя в timer1_Tick создать поле класса.

А теперь давайте будем очень простыми: вы хотите воспроизводить звук, пока KeyDown звонит, или, скажем так, пока вы не отпустите кнопку, верно?

Здесь вам нужно сделать две вещи:

  1. Позвонить player.PlayLooping на KeyDown или KeyPress.
  2. Позвонить SoundPlayer.Stop () метод, аналогичный вызову player.Stop() при событии KeyUp.
0 голосов
/ 14 июля 2020

В большинстве систем, когда вы удерживаете клавишу, вы начнете получать повторяющиеся нажатия клавиш после небольшой задержки . Таким образом, вы получите много-много событий нажатия клавиш ... и в конечном итоге вы также вызовете PlayLooping() много раз. Это приведет к его сбросу каждый раз, что приведет к прерывистому звуку, или он может сбрасываться так быстро, что будет казаться, что он вообще не воспроизводится.

Чтобы решить эту проблему, настройте логическое значение, которое отслеживает независимо от того, воспроизводится ли уже звук или нет, поэтому вы вызываете PlayLooping() только один раз. Вероятно, вам также следует переместить свой экземпляр SoundPlayer на уровень класса, так как нет необходимости каждый раз перезагружать его. Итак, при нажатии мы вызываем PlaySound(true), а при нажатии - 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...