2

ゲームに問題があります。GameState.MainMenuとの 2 つの状態に分かれていGameState.Playingます。プレイ中にタイマーを画面に描画したい。gameTime.TotalGameTime.MinutesgameTime.TotalGameTime.Seconds変数を使用します。しかし、[今すぐプレイ] ボタンをクリックすると、ゲームの状態が からGameState.MainMenuに切り替わるとGameState.Playing、タイマーは 0 から始まりません。MainMenu で過ごしたときに経過した時間から始まります。MainMenu で費やした時間をカウントする次の変数を作成して、最初の変数から減算しようとしましたが、時間が正しく表示されません。

私の減算時間:

minutesPlaying = gameTime.TotalGameTime.Minutes; ;
secondsPlaying = gameTime.TotalGameTime.Seconds;

switch (currentGameState)
{
    case GameState.MainMenu:

        minutesMenu = gameTime.TotalGameTime.Minutes;
        secondsMenu = gameTime.TotalGameTime.Seconds;



        if (btnPlay.isTapped == true) 
        { 
            currentGameState = GameState.Playing;
            soundEffectInstance.Stop();
        }
        btnPlay.Update(collection);
        break;

    case GameState.Playing:

        minutesTotal = minutesPlaying - minutesMenu;
        secondsTotal = secondsPlaying - secondsMenu;

        break;
}

私のメソッドを呼び出します:

timer.Update(minutesTotal, secondsTotal);

更新方法:

public void Update(int min, int sec)
{
    string seconds, minutes;
    seconds = sec.ToString();
    minutes = min.ToString();

    if (sec <= 9) seconds = "0" + seconds;
    if (min <= 9) minutes = "0" + minutes;

    nowString = minutes + ":" + seconds;
}

ご回答ありがとうございます :)

4

4 に答える 4

0

あなたは正しい軌道に乗っていますが、元の変数から減算するのではなく、時間経過変数を使用する必要があると思いますgameTime。このようにして、メニューに戻ってからゲームに戻っても、メソッドが壊れることはありません。基本的にTimeSpanは 0 を取り、gameTime時間が経過するにつれて加算され、レベルで費やされた時間が得られます。

まずは新規追加TimeSpan

public TimeSpan TimePassed;

Update()内部のメソッドでcase GameState.Playing:、タイマーをインクリメントする必要があります。

TimePassed -= gameTime.ElapsedGameTime;

新しいレベルを作成する必要がある場合は、タイマーをゼロにリセットすることもできます (その場合、例: レベルを再生するにはタイマーをリセットする必要があります)。

次に、メソッドで時間をレンダリングしますDraw()

string timeString = TimePassed.Minutes.ToString("00") + ":" + TimePassed.Seconds.ToString("00");
spriteBatch.DrawString(FONT,timeString,POSITION,Color.White);

そして、そこに行きます!

于 2013-05-24T20:58:00.397 に答える
0

Playing 状態でのみ時間を変更する必要があります。コードを変更して、あまり変更せずにそれを達成しました... PlayTime は、再生状態で経過した合計時間を保持します。

    TimeSpan Elapsed ;

    switch (currentGameState)
    {
        case GameState.MainMenu:

            if (btnPlay.isTapped == true) 
            { 
                currentGameState = GameState.Playing;
                soundEffectInstance.Stop();
            }
            btnPlay.Update(collection);
            Elapsed = TimeSpan.Zero;
            break;

        case GameState.Playing:

            Elapsed = gametime.ElapsedGameTime;
            break;
    }

私のメソッドを呼び出します:

    timer.Update(Elapsed);

更新方法:

TimeSpan PlayTime = TimeSpan.Zero;
public void Update(TimeSpan Elapsed)
{
    PlayTime.Add(Elapsed);

    string seconds, minutes;
    seconds = PlayTime.Seconds.ToString();
    minutes = PlayTime.Minutes.ToString();

    if (sec <= 9) seconds = "0" + seconds;
    if (min <= 9) minutes = "0" + minutes;

    nowString = minutes + ":" + seconds;
}
于 2013-05-24T21:13:31.867 に答える
0

「ストップウォッチ」を使用して、プレイ状態で費やされた時間の追跡を「開始」および「一時停止」します。再生状態に入ったら「ストップウォッチ」を開始し、その状態を離れるときに一時停止します。

于 2013-05-24T19:26:04.703 に答える
0

これを試して:

ゲームが始まる前に時間を追跡する必要がないので、 でminutesPlayingsecondsPlayingを 0 に設定しましたGameState.MainMenu。メイン関数内では初期minutesPlaying化しないでください。secondsPlayingUpdate()

minutesPlaying = 0;
secondsPlaying = 0;

switch (currentGameState)
{
    case GameState.MainMenu:

        if (btnPlay.isTapped == true) 
        { 
           currentGameState = GameState.Playing;
           soundEffectInstance.Stop();
        }
        btnPlay.Update(collection);
        break;

    case GameState.Playing:

        secondsPlaying += gameTime.ElapsedGameTime.Seconds;
        if (secondsPlaying >= 60)
        {
            minutesPlaying++;
            secondsPlaying = 0;
        }
        break;
}

時刻を表示するときは、 と を表示するだけminutesPlayingですsecondsPlaying。追加の変数は必要ありません。

それがうまくいかない場合は、ゲームの開始時に経過したミリ秒 ( ) をいつでも追跡しsecondsPlaying += gameTime.ElapsedGameTime.Milliseconds、値を 1000 で割って秒を表示できます。

于 2013-05-28T19:23:00.003 に答える