Exemple #1
0
        public static int GetWheelsOutsideRoadVerge(DrivableVehicle car)
        {
            var leftVerge1 = car.CurrentNode.GetLeftVerge();
            var leftVerge2 = car.CurrentNode.Next.GetLeftVerge();

            var rightVerge1 = car.CurrentNode.GetRightVerge();
            var rightVerge2 = car.CurrentNode.Next.GetRightVerge();

            int wheelsOutsideVerge = 0;

            for (int wheelNumber = 0; wheelNumber < 4; wheelNumber++)
            {
                VehicleWheel wheel = car.Wheels[wheelNumber];

                if (Utility.IsLeftOfLine(leftVerge2, leftVerge1, wheel.WorldPosition))
                {
                    wheelsOutsideVerge++;
                }
                else if (!Utility.IsLeftOfLine(rightVerge2, rightVerge1, wheel.WorldPosition))
                {
                    wheelsOutsideVerge++;
                }
            }

            return(wheelsOutsideVerge);
        }
        public bool AutoDrift;          //used for ai racers

        public DrivableVehicle(VehicleDescription desc)
            : base(desc.ModelFile)
        {
            Descriptor = desc;
            float offset = VehicleWheel.Width / 2 - 0.1f;

            Wheels    = new VehicleWheel[4];
            Wheels[0] = new VehicleWheel(this, _model.LeftFrontWheelPos, _model.FrontWheelSize, _model.WheelTexture, offset);
            Wheels[1] = new VehicleWheel(this, _model.RightFrontWheelPos, _model.FrontWheelSize, _model.WheelTexture, -offset);
            Wheels[2] = new VehicleWheel(this, _model.LeftRearWheelPos, _model.RearWheelSize, _model.WheelTexture, offset);
            Wheels[3] = new VehicleWheel(this, _model.RightRearWheelPos, _model.RearWheelSize, _model.WheelTexture, -offset);

            List <float> power  = new List <float>(new float[] { 0.2f, 0.3f, 0.4f, 0.7f, 0.8f, 1.0f, 0.8f, 0.8f, 0.8f, 0.3f });
            List <float> ratios = new List <float>(new float[] { 3.827f, 2.360f, 1.685f, 1.312f, 1.000f, 0.793f });

            BaseGearbox gearbox = BaseGearbox.Create(GameConfig.ManualGearbox, ratios, 0.2f);

            Motor = new Motor(power, Descriptor.Horsepower, Descriptor.Redline, gearbox);
            Motor.Gearbox.GearChangeStarted += new EventHandler(Gearbox_GearChanged);
            _traction = (Motor.GetPowerAtRpmForGear(Motor.RedlineRpm, 2) * 30) - 30;

            BodyPitch = new Spring(1200, 1.5f, 200, 0, 1.4f);
            BodyRoll  = new Spring(1200, 1.5f, 180, 0, 3);

            _audioProvider = new VehicleAudioProvider(this);
        }
Exemple #3
0
        public DrivableVehicle(VehicleDescription desc)
            : base(desc.ModelFile)
        {
            Descriptor = desc;
            float offset = VehicleWheel.Width / 2 - 0.1f;
            Wheels = new VehicleWheel[4];
            Wheels[0] = new VehicleWheel(this, _model.LeftFrontWheelPos, _model.FrontWheelSize, _model.WheelTexture, offset);
            Wheels[1] = new VehicleWheel(this, _model.RightFrontWheelPos, _model.FrontWheelSize, _model.WheelTexture, -offset);
            Wheels[2] = new VehicleWheel(this, _model.LeftRearWheelPos, _model.RearWheelSize, _model.WheelTexture, offset);
            Wheels[3] = new VehicleWheel(this, _model.RightRearWheelPos, _model.RearWheelSize, _model.WheelTexture, -offset);

            List<float> power = new List<float>(new float[] { 0.2f, 0.3f, 0.4f, 0.7f, 0.8f, 1.0f, 0.8f, 0.8f, 0.8f, 0.3f });
            List<float> ratios = new List<float>(new float[] { 3.827f, 2.360f, 1.685f, 1.312f, 1.000f, 0.793f });

            BaseGearbox gearbox = BaseGearbox.Create(GameConfig.ManualGearbox, ratios, 0.2f);
            Motor = new Motor(power, Descriptor.Horsepower, Descriptor.Redline, gearbox);
            Motor.Gearbox.GearChangeStarted += new EventHandler(Gearbox_GearChanged);
            _traction = (Motor.GetPowerAtRpmForGear(Motor.RedlineRpm, 2) * 30) - 30;

            BodyPitch = new Spring(1200, 1.5f, 200, 0, 1.4f);
            BodyRoll = new Spring(1200, 1.5f, 180, 0, 3);

            _audioProvider = new VehicleAudioProvider(this);
        }
Exemple #4
0
        public static void Handle(DrivableVehicle car)
        {
            var leftBound1 = car.CurrentNode.GetLeftBoundary();
            var leftBound2 = car.CurrentNode.Next.GetLeftBoundary();

            var rightBound1 = car.CurrentNode.GetRightBoundary();
            var rightBound2 = car.CurrentNode.Next.GetRightBoundary();


            for (int wheelNumber = 0; wheelNumber < 4; wheelNumber++)
            {
                VehicleWheel wheel          = car.Wheels[wheelNumber];
                Vector3      fenceNormal    = Vector3.Zero;
                bool         collision      = false;
                float        collisionAngle = 0;
                float        direction      = 0;
                if (Utility.IsLeftOfLine(leftBound2, leftBound1, wheel.WorldPosition))
                {
                    fenceNormal    = Vector3.Cross(Vector3.Normalize(leftBound2 - leftBound1), car.CurrentNode.Up);
                    collisionAngle = Vector3Helper.GetAngleBetweenVectors(car.Right, fenceNormal);
                    collision      = true;
                    direction      = -1;
                }
                else if (!Utility.IsLeftOfLine(rightBound2, rightBound1, wheel.WorldPosition))
                {
                    fenceNormal    = Vector3.Cross(car.CurrentNode.Up, Vector3.Normalize(rightBound2 - rightBound1));
                    collisionAngle = Vector3Helper.GetAngleBetweenVectors(-car.Right, fenceNormal);
                    collision      = true;
                    direction      = 1;
                }

                if (!collision)
                {
                    continue;
                }

                Vector3 collisionDir = Vector3.Reflect(car.Direction, fenceNormal);
                // Force car back on the road, for that calculate impulse and collision direction

                // Flip at 180 degrees (if driving in wrong direction)
                if (collisionAngle > MathHelper.Pi / 2)
                {
                    collisionAngle -= MathHelper.Pi;
                }

                // Just correct rotation if we hit the fence at a shallow angle
                if (Math.Abs(collisionAngle) < MathHelper.ToRadians(45))
                {
                    SlideAlongFence(car, wheelNumber, collisionAngle, direction);
                }

                // If 90-45 degrees (in either direction), make frontal crash
                // + stop car + wobble camera
                else if (Math.Abs(collisionAngle) < MathHelper.Pi * 3.0f / 4.0f)
                {
                    HandleHeadOnCrash(car, wheelNumber, collisionAngle);
                }

                // move away from the way slightly.  We should be a bit smarter and along more of a slide along the wall..
                car.Position += fenceNormal * 1.5f;
                break;
            }
        }