0

タイマーが関係するゲームがあります。通過する 2 分ごとに、異なるプレイヤー間の新しいラウンドが開始されます。したがって、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;
  } 
4

2 に答える 2

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);

ゲームをロードするたびに、タイムアウト前に表示された開始時間として計算されます。

于 2012-12-09T10:39:09.597 に答える
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");
}
于 2012-12-09T11:01:19.343 に答える