Exemplo n.º 1
0
        private void Simulate(IShipController controller)
        {
            Vector2D gravity = new Vector2D();

            foreach (Planet planet in Planets)
            {
                Vector2D distance = planet.Position - Ship.Position;
                if (distance.Length <= planet.Radius)
                {
                    IsActive = false;
                }
                gravity += 15 * 0.001 * (Math.Pow(planet.Radius, 3) / Math.Pow(distance.Length, 3)) * distance;
            }
            Ship.Velocity += gravity;

            controller.UpdateShip(this, gravity);
            ++TimeSteps;

            const double MaxTurn = 2 * Math.PI / 25;

            Ship.Angle += Math.Max(-MaxTurn, Math.Min(MaxTurn, Ship.Turn));

            Ship.Velocity += 12 * 0.02 * Ship.Direction;
            Ship.Position += Ship.Velocity;

            double targetDistance = (Ship.Position - Waypoints[TargetWaypoint]).Length;

            if (targetDistance < 20)
            {
                ++TargetWaypoint;
                if (TargetWaypoint == Waypoints.Count)
                {
                    IsActive = false;
                }
            }
            else if (targetDistance > 1500)
            {
                IsActive = false;
            }

            if (TraceMovement)
            {
                Trace.Add(Ship.Position);
            }
        }