2012-08-10 5 views
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 
+0

왜 mod 60? runtime (milliseconds)/1000을 사용하면 초 단위로 실행 시간을 얻을 수 있습니까? –

+0

musicPlayer는 나에게 위치의 초 부분 만 제공합니다. 그래서 1:26에 나에게 26을 줄 것이다. 나는 달리기 시간에 mod 60을했다. – connor

+0

오, 그건 의미가 있습니다. 내 추측에 따르면,'musicPlayer.Play()'는 아마도 실제로 재생되기 전에해야 할 초기화/버퍼링/로딩 등을 가지고있을 것입니다. 얼마나 뒤떨어져 있니? –

답변

1

DispatcherTimer.Interval가 틱 이벤트 사이를 통과하는 시간의 최소 양의 일부입니다. 보통 더 많습니다. _startTime = DateTime.Now와 같은 것을 사용해야하고 나중에 _runningTime = DateTime.Now - _startTime을 수행해야합니다. _startTime을 측정하기 전에 musicPlayer.CurrentState == MediaElementState.Playing까지 musicPlayer.CurrentStateChanged를 기다릴 수도 있습니다.

다시 말해서, musicPlayer.Position을 _runningTime 값으로 가져 오지 않는 이유는 무엇입니까?