我有一个游戏,其中涉及计时器。每两分钟就会在不同玩家之间进行新一轮比赛。所以,我有一个从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;
}
答案 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");
}