public void terminate() { _state = State.Terminated; _driver = null; if (cluster.parameters.debuggingAid) { System.Console.WriteLine("missile terminated on request at t = " + _cluster.timeSinceLaunch); } }
public SSpaceMissileData(SSpaceMissileClusterData cluster, int clusterId, Vector3 initClusterPos, Vector3 initClusterVel, Vector3 missilePos, float timeToHitTarget) { _cluster = cluster; _clusterId = clusterId; _state = State.Ejection; _position = missilePos; _driver = _cluster.parameters.createEjection(this, initClusterPos, initClusterVel); _driver.updateExecution(0f); }
public void updateExecution(float timeElapsed) { _position += velocity * timeElapsed; var mParams = _cluster.parameters; switch (_state) { case State.Ejection: if (cluster.timeSinceLaunch >= mParams.pursuitActivationTime) { _state = State.Pursuit; _driver = mParams.createPursuit(this); if (mParams.debuggingAid) { System.Console.WriteLine("missile pursuit activated at t = " + cluster.timeSinceLaunch); } } break; case State.Pursuit: bool forceHit = (mParams.pursuitHitTimeCorrection && _cluster.timeToHit <= 0f); if (forceHit) { // fake a velocity large enough to make hit test succeeed velocity = cluster.target.velocity + (_cluster.target.position - _position) / timeElapsed; if (mParams.debuggingAid) { System.Console.WriteLine("forcing missile at target (hit time correction)"); } } Vector3 hitPos; bool hitTestSucceeded = cluster.target.hitTest(this, out hitPos); if (hitTestSucceeded || forceHit) { _position = hitTestSucceeded ? hitPos : _cluster.target.position; velocity = Vector3.Zero; _state = State.AtTarget; _driver = null; if (mParams.debuggingAid) { System.Console.WriteLine("missile at target at t = " + cluster.timeSinceLaunch); if (float.IsNaN(_position.X)) { System.Console.WriteLine("bad position"); } } } break; case State.AtTarget: if (mParams.terminateWhenAtTarget) { _state = State.Terminated; _driver = null; if (mParams.targetHitHandlers != null) { mParams.targetHitHandlers(_position, mParams); } if (mParams.debuggingAid) { System.Console.WriteLine("missile terminated at target at t = " + cluster.timeSinceLaunch); } } break; case State.Intercepted: // todo break; case State.Terminated: throw new Exception ("missile state machine still running while in the terminated state"); break; } if (_driver != null) { _driver.updateExecution(timeElapsed); } }
public void terminate() { _state = State.Terminated; _driver = null; System.Console.WriteLine("missile terminated on request at t = " + _cluster.timeSinceLaunch); }
public void updateExecution(float timeElapsed) { _position += velocity * timeElapsed; var mParams = _cluster.parameters; switch (_state) { case State.Ejection: if (cluster.timeSinceLaunch >= mParams.pursuitActivationTime) { _state = State.Pursuit; _driver = mParams.createPursuit(this); if (mParams.debuggingAid) { System.Console.WriteLine("missile pursuit activated at t = " + cluster.timeSinceLaunch); } } break; case State.Pursuit: bool forceHit = (mParams.pursuitHitTimeCorrection && _cluster.timeToHit <= 0f); if (forceHit) { // fake a velocity large enough to make hit test succeeed velocity = cluster.target.velocity + (_cluster.target.position - _position) / timeElapsed; if (mParams.debuggingAid) { System.Console.WriteLine("forcing missile at target (hit time correction)"); } } Vector3 hitPos; bool hitTestSucceeded = cluster.target.hitTest(this, out hitPos); if (hitTestSucceeded || forceHit) { _position = hitTestSucceeded ? hitPos : _cluster.target.position; velocity = Vector3.Zero; _state = State.AtTarget; _driver = null; if (mParams.debuggingAid) { System.Console.WriteLine("missile at target at t = " + cluster.timeSinceLaunch); if (float.IsNaN(_position.X)) { System.Console.WriteLine("bad position"); } } } break; case State.AtTarget: if (mParams.terminateWhenAtTarget) { _state = State.Terminated; _driver = null; if (mParams.targetHitHandlers != null) { mParams.targetHitHandlers(_position, mParams); } if (mParams.debuggingAid) { System.Console.WriteLine("missile terminated at target at t = " + cluster.timeSinceLaunch); } } break; case State.Intercepted: // todo break; case State.Terminated: throw new Exception("missile state machine still running while in the terminated state"); break; } if (_driver != null) { _driver.updateExecution(timeElapsed); } }