1

私は音楽を入れたゲームを作ろうとしてきました。プログラムの実行時間を追跡するためにタイマーを使用していますが、音楽の再生時間をプログラムの実行時間と一致させることができませんでした。ほとんどすべてのコードを削除しても、それでも遅くなります。これが私がコードのために持っているものです。

    int timeInterval;
    int runningTime;
    DispatcherTimer drawTimer;
    public Game()
    {
        timeInterval = 100;
        drawTimer = new DispatcherTimer();
        drawTimer.Interval = TimeSpan.FromMilliseconds(timeInterval);
        drawTimer.Tick += dispatcherTimer_Tick;

    }
    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        runningTime = 0;

        StorageFile file;
        StorageFolder InstallationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
        string filePath = @"soundtrack.m4a";
        musicPlayer = new MediaElement();
        file = await InstallationFolder.GetFileAsync(filePath);
        var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
        musicPlayer.SetSource(stream, file.ContentType);
        musicPlayer.Play();
        drawTimer.Start();
    }

    void dispatcherTimer_Tick(object sender, object e)
    {
        runningTime += timeInterval;

        if ((runningTime / 1000) % 10 == 0)
        {
            System.Diagnostics.Debug.WriteLine("Music: " + musicPlayer.Position.Seconds + "Running time: " + (runningTime / 1000) % 60);
        }
    }

助けてくれてありがとう。

編集:これが出力の一部です

    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 0Running time: 0
    Music: 11Running time: 10
    Music: 11Running time: 10
    Music: 11Running time: 10
    Music: 11Running time: 10
    Music: 12Running time: 10
    Music: 12Running time: 10
    ...
    Music: 9Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
    Music: 10Running time: 0
4

1 に答える 1

1

DispatcherTimer.Intervalは、Tickイベント間で経過する最小時間です。通常はそれ以上です。最初に_startTime=DateTime.Nowのようなものを使用し、後で_runningTime=DateTime.Now--_startTimeを実行する必要があります。_startTimeを測定する前に、musicPlayer.CurrentState==MediaElementState.PlayingまでmusicPlayer.CurrentStateChangedを待機することもできます。

それでは、_runningTime値としてmusicPlayer.Positionを取得してみませんか?

于 2012-08-10T18:50:28.050 に答える