即使if条件明确禁止它,XNA的SoundEffect也会保持循环

时间:2013-02-21 10:38:06

标签: c# windows-phone-7 xna

private void updateDisplay(Object displayBlock)
    {
        TimeSpan ts = timeWatch.Elapsed;

        if (stopRing == true)
        {
            stopRing = true;
            Thread.Sleep(1000);
            stopRing = false;
        }

        if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false)
        {
            stopRing = true;
            btnSound_Click_1(null, null);
        }

        TextBlock db = (TextBlock)displayBlock;
        db.Dispatcher.BeginInvoke(delegate() { db.Text = String.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds); });


    }
编辑:if(stopRing == true)的原因是因为在将来,我想为下面的函数添加更多条件,以便在一段时间后再次响铃,例如:

if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false || ts.Minutes == 0 && ts.Seconds == 20 && ts.Milliseconds <= 100 && stopRing == false)

但为了使调试过程更简单,我只做了if条件,这样当ts.Seconds = 10时它只响一次。当我按下reset按钮,并且ts.Seconds再次从0变为10时,它应该只响一次,但此刻它会多次响起,不可预测。

我的声音效果代码是:

private void btnSound_Click_1(object sender, RoutedEventArgs e)
    {
       Stream stream = TitleContainer.OpenStream("sounds/Ding.wav");
       SoundEffect effect = SoundEffect.FromStream(stream);
       FrameworkDispatcher.Update();

       effect.Play();
    }

更新显示功能由:

调用
timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);

如果我将TimerCallBack周期切换到较低的值(例如此处看到的100),SoundEffect将很快播放多次。如果我将TimerCallBack增加到更高的值(如500),SoundEffect将播放2-3次,有时很快就会播放约200ms的延迟。

我这里的想法已经不多了......我不知道当我将布尔值指定为true时声音如何播放,从而阻止它执行。 任何帮助将不胜感激。

(在代码顶部定义了stopRing)

编辑:还有一些事情要补充:第一次,SoundEffect通常效果很好(只有一次)。但是,如果我按下重置按钮并再试一次,SoundEffect大部分时间都会播放多次,有时则可以。

以下是重置按钮的代码:

    private void btnReset_Click(object sender, RoutedEventArgs e)
    {
        timeWatch.Stop();
        timeWatch.Reset();
        paused = true;
        btnStartStop.Content = "Start";
        textblockTimer.Text = "00:00";
    }

和我的开始/停止按钮:

private void btnStartStop_Click(object sender, RoutedEventArgs e)
    {
        if (paused == true)
        {
            timeWatch.Start();
            timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);
            paused = false;
            btnStartStop.Content = "Pause";
        }
        else
        {
            timeWatch.Stop();
            paused = true;
            btnStartStop.Content = "Start";
        }
    }

2 个答案:

答案 0 :(得分:0)

有些事情只是在你的代码中尖叫“逻辑错误”:

  • if中的第二个updateDisplay检查stopRing的值,但stopRing此时将始终为false(如果调用该方法时为true,前一段代码将其设置为false)
  • 您将updateDisplay函数设置为每100毫秒调用一次,但它包含Thread.Sleep 1000毫秒。

此时我不确定究竟是什么导致了您所看到的行为,但这应该为您提供一些调查途径。

答案 1 :(得分:0)

我发现了问题,当我按下重置按钮重新校准定时器时,我需要调用timer.Dispose()方法,以便上一个定时器实例不会干扰新定时器。

解决!

那是什么意思? 这意味着我不必再使用stopRing布尔值(不是它有帮助),从而产生更清晰的代码。

谢谢大家的帮助!