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); }
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); }
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; } }