定时器不从00:00开始

时间:2012-12-09 10:34:00

标签: c# time save

我有一个游戏,其中涉及计时器。每两分钟就会在不同玩家之间进行新一轮比赛。所以,我有一个从00:00开始的文本框,每秒更改一次,直到它等于02:00。

现在,如果用户关闭表单,我想在一轮中间保存游戏状态。我需要做的是,在加载时,文本框在用户最后一次离开游戏时开始并且一直持续到02:00。

我该怎么做?

这就是我现在所拥有的锦标赛表格

public Tournament()
{
     _timer = new System.Windows.Forms.Timer();
     _timer.Interval = 1000;
     _timer.Tick += Timer_Tick;
     _myDateTime = DateTime.Now;
     newDate = new DateTime();
     newDate = newDate.AddMinutes(2.00);
     _timer.Start();
     InitializeComponent();
}

void Timer_Tick(object sender, EventArgs e)
{
     var diff = DateTime.Now.Subtract(_myDateTime);
     this.textBox1.Text = diff.ToString(@"mm\:ss");

     DateTime dt = Convert.ToDateTime(diff.ToString());

     if (newDate.Minute == dt.Minute)
     {
         _timer.Stop();
         _myDateTime = DateTime.Now;

         displayPointsOrResults();

         this.textBox1.Text = diff.ToString(@"mm\:ss");  
     }
   }

在我的LoadGame方法中:timePassed是我在文本框中编写的内容

  string[] splitted6 = timePassed.Split(':');

  if (splitted6[0] == "00")
  {
      int remainingTime = 120 - Convert.ToInt32(splitted6[1]);

      DateTime time = DateTime.Now.Date; 
      time = time.AddMinutes(remainingTime);

      _myDateTime = time;
  }
  else
  {
      int leftTime = Convert.ToInt32(splitted[0].Trim('0') + splitted[1]);
      int remainingTime = 120 - leftTime;

      DateTime time = DateTime.Now.Date; 
      time = time.AddMinutes(remainingTime);

      _myDateTime = time;
  } 

2 个答案:

答案 0 :(得分:2)

使用TimeSpan代替DateTime来保存并加载当前超时:

int _roundDuration = 2 * 60; // 2 minutes

void Timer_Tick(object sender, EventArgs e)
{
     TimeSpan diff = DateTime.Now - _myDateTime;
     textBox1.Text = diff.ToString(@"mm\:ss");
     if (diff.TotalSeconds >= _roundDuration)
     {
          _timer.Stop();    
          _myDateTime = DateTime.Now;
          displayPointsOrResults();
     }
}

加载游戏时(解析textBox1.Text):

TimeSpan diff = TimeSpan.ParseExact(textBox1.Text, @"mm\:ss", null);
_myDateTime = DateTime.Now.Substract(diff);

每当你加载游戏时,开始时间将按照超时前显示的时间计算。

答案 1 :(得分:1)

你到目前为止过于复杂!不要将值保存为字符串(例如标签的Text)或解析任何“字符串化”值。

而是使用为显示原因格式化的幕后计数器(例如计数秒数):

int _seconds = 0;
const int _roundDuration = 120; // 2 minutes

...

void Timer_Tick(object sender, EventArgs e)
{
    if (_seconds++ >= _roundDuration)
    {
        _seconds = 0;
        displayPointsOrResults();
    }
    textBox1.Text = (_seconds / 60).ToString("D2") + ":" + (_seconds % 60).ToString("D2");
}