你的做法是错误的。首先计算“游戏时间”与“正常时间”的比率。然而,月份是有问题的,因为一个月中的天数是可变的。相反,我们可以使用四分之一 (365 / 4) 并从那里开始工作。使用秒表来跟踪已经过去了多少时间,并将其添加到参考日期以获得“实时”。那么,“游戏时间”就是经过时间乘以比率,然后加上参考时间。使用这个模型,Timer Interval() 是IRREVELANT;我们可以每分钟更新一次、每秒一次或每秒四次,并且用于确定真实/游戏时间的代码完全一样……当我们更新显示时,所有时间都保持准确:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// update once per second, but the rate here is IRREVELANT...
// ...and can be changed without affecting the real/game timing
timer1.Interval = 1000;
timer1.Tick += new EventHandler(timer1_Tick);
}
private DateTime dtReal;
private DateTime dtGame;
private DateTime dtReference;
private System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();
private double TimeRatio = (TimeSpan.FromDays(365).TotalMilliseconds / 4.0) / TimeSpan.FromMinutes(1).TotalMilliseconds;
private void button1_Click(object sender, EventArgs e)
{
StartTime();
}
private void StartTime()
{
dtReference = new DateTime(2013, 1, 1);
SW.Restart();
timer1.Start();
}
void timer1_Tick(object sender, EventArgs e)
{
UpdateTimes();
DisplayTimes();
}
private void UpdateTimes()
{
double elapsed = (double)SW.ElapsedMilliseconds;
dtReal = dtReference.AddMilliseconds(elapsed);
dtGame = dtReference.AddMilliseconds(elapsed * TimeRatio);
}
private void DisplayTimes()
{
lblReference.Text = dtReference.ToString();
lblReal.Text = dtReal.ToString();
lblGame.Text = dtGame.ToString();
}
}
编辑:添加截图...
一分钟后 = 大约 3 个月
四分钟后 = 大约 1 年