Taken straight from Bauble Play. Does exactly what you want. It takes two points, figures out how much velocity something needs to get to that point in said time (milliseconds).
_vel = velocity
_mod = velocity * time elapsed since last update
Number could be renamed to 'CurrentPosition' you then update the Sprite or whatever you need with IncrementNumber.Number
Code:
public class IncrementNumber : Command
{
Vector3 _vel;
Vector3 _mod;
public Vector3 Number { get; set; }
public Vector3 Max { get; set; }
public Vector3 Min { get; set; }
public int Life { get; set; }
/// <summary>
/// Increments a number over a period of time
/// </summary>
/// <param name="number">reference to the varable incremented</param>
/// <param name="max">the maximum value</param>
/// <param name="life">how long does it take to get to the max in miliseconds</param>
public IncrementNumber(Vector3 vec, Vector3 max, int life)
{
Life = life;
Max = max;
Min = vec;
this.Done = false;
}
public IncrementNumber(Vector3 max, int life)
{
Life = life;
Max = max;
this.Done = false;
}
protected override void BeforeFirstRun()
{
_vel = (Max - Min) / Life;
Number = Min;
if (_vel == Vector3.Zero)
this.Done = true;
}
public override void Reset()
{
base.Reset();
Number = Min;
}
public override bool Run(long time_elapsed)
{
_mod = (_vel * time_elapsed);
Number = Number + _mod;
if ((_vel.X < 0 && Number.X < Max.X) || (_vel.X > 0 && Number.X > Max.X))
{
Number = Max;
Done = true;
return true;
}
if ((_vel.Y < 0 && Number.Y < Max.Y) || (_vel.Y > 0 && Number.Y > Max.Y))
{
Number = Max;
Done = true;
return true;
}
if ((_vel.Z < 0 && Number.Z < Max.Z) || (_vel.Z > 0 && Number.Z > Max.Z))
{
Number = Max;
Done = true;
return true;
}
return true;
}