XNA框架中的计时器

时间:2013-05-24 19:17:36

标签: c# timer xna elapsed

我的游戏有问题。它分为两种状态:GameState.MainMenuGameState.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 个答案:

答案 0 :(得分:0)

我会使用'StopWatch'来'开始'和'暂停'跟踪你在游戏状态下花费的时间。进入播放状态后,启动“StopWatch”,然后在离开该状态时暂停。

答案 1 :(得分: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);

你去了!

答案 2 :(得分:0)

你应该只在播放状态下修改时间,我修改了代码来实现它,没有太多变化...... 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;
}

答案 3 :(得分:0)

试试这个:

在游戏开始之前,您无需跟踪时间,因此我在minutesPlaying中将secondsPlayingGameState.MainMenu设置为0。不要在主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;
}

当您显示时间时,只需显示minutesPlayingsecondsPlaying。您不需要任何额外的变量。

如果这不起作用,您可以随时跟踪游戏开始时经过的毫秒数(secondsPlaying += gameTime.ElapsedGameTime.Milliseconds)并将值除以1000以显示秒数。