public GetRelativeVelocity ( ) : |
||
return |
public override void Update(double elapsedTime, SpaceCraftBase spaceCraft) { // Only run the landing algorithm while the spacecraft hasn't touched down if (!_landed) { double speed = spaceCraft.GetRelativeVelocity().Length(); if (spaceCraft.OnGround || speed < 2 || spaceCraft.PropellantMass <= 0) { _landed = true; foreach (IEngine engine in spaceCraft.Engines) { engine.Shutdown(); } } double t = elapsedTime - _lastUpdate; double altitude = spaceCraft.GetRelativeAltitude(); double updateRate = Math.Max(10 - altitude / 300, 1); // Update required this iteration if (t > 1.0 / updateRate) { PredictTargetThrottle(spaceCraft); _lastUpdate = elapsedTime; } } }
// Interpolate between current and target orientation over the duration public override void Update(double elapsedTime, SpaceCraftBase spaceCraft) { DVector2 prograde = spaceCraft.GetRelativeVelocity(); prograde.Normalize(); double retrogradeAngle = prograde.Angle(); double adjustRatio = (elapsedTime - StartTime) / _adjustmentTime; if (adjustRatio > 1) { spaceCraft.SetPitch(retrogradeAngle); } else { double interpolatedAdjust = _curentOrientation * (1 - adjustRatio) + retrogradeAngle * adjustRatio; spaceCraft.SetPitch(interpolatedAdjust); } }