2

我的游戏有问题。它分为两种状态:GameState.MainMenuGameState.Playing。我想在播放时在屏幕上绘制计时器。我使用gameTime.TotalGameTime.MinutesgameTime.TotalGameTime.Seconds变量。但是当我点击按钮 Play Now,并且我的游戏从状态切换GameState.MainMenuGameState.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

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

你在正确的轨道上,但我认为你应该有一个时间传递变量,而不是从原始变量中减去它gameTime,这样如果你回到菜单,然后回到游戏,你的方法就不会被破坏。基本上它只需要一个TimeSpan0 并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

我会使用“秒表”来“开始”和“暂停”跟踪您在播放状态中花费的时间。当进入播放状态时,启动“StopWatch”,然后在离开该状态时暂停。

于 2013-05-24T19:26:04.703 回答
0

尝试这个:

在游戏开始之前你不需要记录时间,所以minutesPlayingsecondsPlayingGameState.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;
}

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

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

于 2013-05-28T19:23:00.003 回答