示例#1
0
 public void terminate()
 {
     _state  = State.Terminated;
     _driver = null;
     if (cluster.parameters.debuggingAid)
     {
         System.Console.WriteLine("missile terminated on request at t = " + _cluster.timeSinceLaunch);
     }
 }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
            }
        }
示例#5
0
 public void terminate()
 {
     _state = State.Terminated;
     _driver = null;
     System.Console.WriteLine("missile terminated on request at t = " + _cluster.timeSinceLaunch);
 }
示例#6
0
        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);
            }
        }