Причина, по которой ваше простое «умножение» не работает, заключается в том, что оно не ускоряет течение времени - этот коэффициент применяется ко всему времени, когда прошло , а также ко времени, когда проходит .
Итак, если вы установите коэффициент скорости на 3
, а затем подождите 10 минут, ваши часы будут правильно показывать 30 минут. Но если вы затем измените коэффициент на 2
, ваши часы будут сразу показывать 20 минут, потому что умножение применяется к уже прошедшему времени. Это явно не правильно.
Я не думаю, что секундомер - это класс, с которым вы хотите измерять «системное время». Я думаю, что вы хотите измерить его самостоятельно и сохранить прошедшее время в своей собственной переменной.
Предполагая, что ваш целевой проект действительно является игрой, вы, скорее всего, будете иметь свой "игровой цикл" где-то в коде. Каждый раз в цикле вы можете использовать обычный объект секундомера, чтобы измерить, сколько прошло в реальном времени. Умножьте это значение на свой коэффициент ускорения и добавьте его в отдельный счетчик игрового времени. Таким образом, если вы уменьшите свой коэффициент скорости, вы только уменьшите коэффициент, примененный к времени прохождения , а не к времени, которое вы уже записали.
Вы можете обернуть все это поведение в свой собственный класс секундомера, если это будет необходимо. Если вы сделаете это, то я бы посоветовал вам рассчитывать / накапливать прошедшее время как «каждый раз, когда это требуется», так и «каждый раз, когда коэффициент изменяется». Итак, у вас есть что-то вроде этого (обратите внимание, что я пропустил объявления полей и некоторые простые частные методы для краткости - это просто грубая идея):
public class SpeedyStopwatch
{
// This is the time that your game/system will run from
public TimeSpan ElapsedTime
{
get
{
CalculateElapsedTime();
return this._elapsedTime;
}
}
// This can be set to any value to control the passage of time
public double ElapsedTime
{
get { return this._timeFactor; }
set
{
CalculateElapsedTime();
this._timeFactor = value;
}
}
private void CalculateElapsedTime()
{
// Find out how long (real-time) since we last called the method
TimeSpan lastTimeInterval = GetElapsedTimeSinceLastCalculation();
// Multiply this time by our factor
lastTimeInterval *= this._timeFactor;
// Add the multiplied time to our elapsed time
this._elapsedTime += lastTimeInterval;
}
}