1

各レベルにタイマーを使用する Windows 8 ゲーム アプリがあり、タイマーを 3 秒にしようとしています。

タイマーを開始する必要があるコードは機能しますが、タイマーを遅らせてカウントダウンする単語を表示できないようです。

コードは次のとおりです。

private async void timer_Tick(object sender, object e)
        {
            await
                Time.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low,
                    () =>
                    { Time.Text = string.Format("{0}:{1}", (Counter/60), (Counter%60).ToString().PadLeft(2, ' ')); });
            Counter--;
            await Task.Delay(3000);}}

await Task.Delay(3000); を置くべきだと思ったので、そこに async を置きました。タイマーを遅らせるためのカウンターの後ですが、機能しません。アニメーションが必要ないため、WinRT Xaml ツールキットのカウントダウン タイマーは使用しません。

私が間違っていることについての提案は素晴らしいでしょう!

4

1 に答える 1

2

おそらく、このカウントダウンを取得するために、ディスプレイを毎秒更新したいと思いますか? しかし、私が理解した場合、何らかの理由ですべてを 3 秒遅らせたいと考えています。

現在起こっていることよりも 3 秒遅れて物事が起こるようにしたい場合、明白な解決策は、タイマーをプログラムして、実際にやりたいときに電話をかけることです。

private DispatcherTimer t = new DispatcherTimer();
private int Counter = 120;

public MainPage()
{
    InitializeComponent();

    t.Interval = TimeSpan.FromSeconds(4);
    t.Tick += timer_Tick;
    t.Start();
}

private void timer_Tick(object sender, object o)
{
    t.Interval = TimeSpan.FromSeconds(1);
    Time.Text = string.Format("{0}:{1}", (Counter / 60), (Counter % 60).ToString().PadLeft(2, ' '));
    Counter--;
}

これにより、最初のティックが到着するまでに 4 秒かかり、間隔が 1 秒に調整されます。したがって、ティックは 1 秒間隔で取得されますが、すべてがそうでない場合よりも 3 秒遅れて発生します。(ティック間隔を最初に 1 に設定すると、最初のティックが到着するまでに 1 秒かかります。これが、最初に 4 秒の遅延が必要な理由です。最初のティックが 3 の場合、遅延は 2 秒にすぎません。)

ただし、いくつかのことをすぐに行う必要があり、いくつかのことを遅らせる必要がある場合、それを行うための明白な方法の 1 つは、ハンドラーのカウントを 3 秒だけ調整することです。

private const int LevelMaxTime = 120;
private DispatcherTimer t = new DispatcherTimer();
private int Counter = LevelMaxTime;

public MainPage()
{
    InitializeComponent();

    t.Interval = TimeSpan.FromSeconds(1);
    t.Tick += timer_Tick;
    t.Start();
}

private void timer_Tick(object sender, object o)
{
    // Do the undelayed work here, whatever that is...

    // Next, we do the delayed work, if there is any yet.
    int effectiveCount = Counter + 3;
    if (effectiveCount <= LevelMaxTime)
    {
        Time.Text = string.Format("{0}:{1}", (effectiveCount / 60), (effectiveCount % 60).ToString().PadLeft(2, ' '));
    }
    Counter--;
}

これは、有効な現在の時間が実際の時間の 3 秒前になるCurrentため、すべてが 3 秒遅れます。

元のコードにもっと似たことができます:

private async void timer_Tick(object sender, object o)
{
    // Wait for 3 seconds...for some reason
    await Task.Delay(TimeSpan.FromSeconds(3));
    Time.Text = string.Format("{0}:{1}", (Counter / 60), (Counter % 60).ToString().PadLeft(2, ' '));
    Counter--;
}

それはあなたが書いたものに精神的に近いです(私が知る限り)、それは機能しますが、不必要に複雑に見えます. 間違った時間にコールバックを取得して補正しようとするのではなく、適切な時間に電話をかけるようにタイマーをプログラムしてみませんか? タイマーです。話しかけると電話がかかってきます!

于 2013-08-12T16:16:25.230 に答える