La raison pour laquelle votre « multiplication » simple ne fonctionne pas est que cela n'accélère pas le passage du temps - le facteur applique à tous les temps qui a passé , ainsi que le temps qui passe .
Donc, si vous définissez votre facteur de vitesse à 3
puis attendez 10 minutes, votre horloge lu 30 minutes correctement. Mais si vous changez ensuite le facteur en 2
, votre horloge lira immédiatement 20 minutes car la multiplication est appliquée au temps déjà passé. Ce n'est évidemment pas correct.
Je ne pense pas que le chronomètre est la classe que vous voulez mesurer le « temps du système » avec. Je pense que vous voulez le mesurer et stocker le temps écoulé dans votre propre variable.
Si l'on suppose que votre projet cible est vraiment un jeu, vous aurez probablement votre « boucle de jeu » quelque part dans le code. Chaque fois que vous parcourez la boucle, vous pouvez utiliser un objet chronomètre régulier pour mesurer combien de temps réel s'est écoulé. Multipliez cette valeur par votre facteur d'accélération et ajoutez-la à un compteur de temps de jeu séparé. De cette façon, si vous réduisez votre facteur de vitesse, vous réduisez uniquement le facteur appliqué à en passant le temps, et non le temps que vous avez déjà enregistré.
Vous pouvez envelopper tout ce comportement dans votre propre classe chronomètre si besoin est. Si vous faites cela, alors je vous suggère de calculer/accumuler le temps écoulé à la fois "chaque fois que c'est demandé" et aussi "chaque fois que le facteur est changé.«Vous avez donc une chose de classe comme ceci (notez que j'ai des déclarations sur le terrain sautées et des méthodes privées simples par souci de brièveté - c'est juste une idée approximative):
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;
}
}
Je dois manquer quelque chose ... le chronomètre change les minutes toutes les minutes. Si vous cherchez à ralentir le temps, je regarderais ailleurs. –
Vous voulez un chronomètre qui se trouve sur combien de temps une période s'est écoulée? Pourquoi ne pas simplement multiplier sa valeur par un facteur après avoir mesuré? –
... lol @justin ... –