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 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 BumperView(DrivableVehicle car) { _car = car; _camera = new SimpleCamera(); _camera.FieldOfView = GameConfig.FOV; _camera.FarPlaneDistance = GameConfig.DrawDistance; }
public DropCameraView(DrivableVehicle car) { _car = car; _camera = new SimpleCamera(); _camera.FieldOfView = GameConfig.FOV; _camera.FarPlaneDistance = GameConfig.DrawDistance; PositionCameraAtNode(car.Track.RoadNodes[10]); }
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; } }
public VehicleWheel(DrivableVehicle car, Vector3 axlePoint, float size, Texture2D texture, float renderXOffset) { _car = car; _axlePoint = axlePoint; _size = size; _texture = texture; _renderOffset = new Vector3(renderXOffset, 0, 0); _wheelMatrix = Matrix.CreateScale(new Vector3(_size, Width, _size)) * Matrix.CreateRotationZ(MathHelper.ToRadians(-90)); //cylinder geometry faces upwards _smokeEmitter = new ParticleEmitter(TyreSmokeParticleSystem.Instance, 20, WorldPosition); }
public ChaseView(DrivableVehicle car, int distance, int height, int offset) { _car = car; _camera = new FixedChaseCamera(); _camera.FieldOfView = GameConfig.FOV; _camera.FarPlaneDistance = GameConfig.DrawDistance; _camera.ChaseDistance = distance; _camera.ChaseHeight = height; _camera.ChaseOffset = offset; }
public VehicleWheel(DrivableVehicle car, Vector3 axlePoint, float size, Texture2D texture, float renderXOffset) { _car = car; _axlePoint = axlePoint; _size = size; _texture = texture; _renderOffset = new Vector3(renderXOffset, 0, 0); _wheelMatrix = Matrix.CreateScale(new Vector3(_size, Width, _size)) * Matrix.CreateRotationZ(MathHelper.ToRadians(-90)); //cylinder geometry faces upwards _smokeEmitter = new ParticleEmitter(TyreSmokeParticleSystem.Instance, 20, WorldPosition); }
public PlayerUI(DrivableVehicle vehicle) { _vehicle = vehicle; _views.Add(new DebugView(_vehicle)); _views.Add(new ChaseView(_vehicle, 32, 14, 0)); _views.Add(new DashboardView(_vehicle)); _views.Add(new BumperView(_vehicle)); _views.Add(new DropCameraView(_vehicle)); _views[_currentView].Activate(); }
public DashboardView(DrivableVehicle car) { _car = car; _camera = new SimpleCamera(); _camera.FieldOfView = GameConfig.FOV; _camera.FarPlaneDistance = GameConfig.DrawDistance; var dashfile = Path.GetFileNameWithoutExtension(car.Descriptor.ModelFile) + "dh.fsh"; var dashDescription = DashboardDescription.Descriptions.Find(a => a.Filename == dashfile); _dashboard = new Dashboard(car, dashDescription); }
public Dashboard(DrivableVehicle car, DashboardDescription descriptor) { _car = car; _descriptor = descriptor; _car.Motor.Gearbox.GearChangeStarted += new EventHandler(Gearbox_GearChangeStarted); _gearBoxAnimation = new GearboxAnimation(); //_instrumentLine = Engine.Instance.ContentManager.Load<Texture2D>("Content\\SpeedoLine"); if (_tachLineTexture == null) { _tachLineTexture = new Texture2D(Engine.Instance.Device, (int)3, 25); Color[] pixels = new Color[_tachLineTexture.Width * _tachLineTexture.Height]; for (int i = 0; i < pixels.Length; i++) pixels[i] = Color.Red; _tachLineTexture.SetData<Color>(pixels); } FshFile fsh = new FshFile(Path.Combine(@"SIMDATA\DASH", descriptor.Filename)); var bitmaps = fsh.Header; Dash = bitmaps.FindByName("dash"); GearGate = bitmaps.FindByName("gate"); GearKnob = bitmaps.FindByName("nob1"); Leather1 = bitmaps.FindByName("lth1"); Leather2 = bitmaps.FindByName("lth2"); Leather3 = bitmaps.FindByName("lth3"); //steering wheel images, from straight to left, then to the right. Not all cars have all steering angles Wstr = bitmaps.FindByName("wstr"); Wl06 = bitmaps.FindByName("wl06"); Wl14 = bitmaps.FindByName("wl14"); Wl22 = bitmaps.FindByName("wl22"); Wl32 = bitmaps.FindByName("wl32"); if (Wl32 == null) Wl32 = Wl22; Wl45 = bitmaps.FindByName("wl45"); if (Wl45 == null) Wl45 = Wl32; Wr06 = bitmaps.FindByName("wr06"); Wr14 = bitmaps.FindByName("wr14"); Wr22 = bitmaps.FindByName("wr22"); Wr32 = bitmaps.FindByName("wr32"); if (Wr32 == null) Wr32 = Wr22; Wr45 = bitmaps.FindByName("wr45"); if (Wr45 == null) Wr45 = Wr32; }
private static void HandleHeadOnCrash(DrivableVehicle car, int wheel, float collisionAngle) { if (car.AudioEnabled) { EnvironmentAudioProvider.Instance.PlayVehicleFenceCollision(); } // Also rotate car if less than 60 degrees if (Math.Abs(collisionAngle) < MathHelper.Pi / 3.0f) { car.RotateCarAfterCollision = +collisionAngle / 3.0f; } //bounce back a little car.Speed *= -0.15f; }
public DoRaceScreen(Track track) { _track = track; _car = new DrivableVehicle(GameConfig.SelectedVehicle); _playerDriver = new PlayerDriver(_car); _car.AudioEnabled = true; _race = new Race(_track.IsOpenRoad ? 1 : 3, _track, _playerDriver); for (int i = 0; i < 10; i++) { int j = Engine.Instance.Random.Next(VehicleDescription.Descriptions.Count); _race.AddDriver(new RacingAIDriver(VehicleDescription.Descriptions[j])); } //_race.AddDriver(new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "Viper"))); //_race.AddDriver(new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "Viper"))); //_race.AddDriver(new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "Viper"))); //_race.AddDriver(new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "Viper"))); _playerUI = new PlayerUI(_car); /* d = new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "911")); _aiDrivers.Add(d); _track.AddDriver(d); d = new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "Viper")); _aiDrivers.Add(d); _track.AddDriver(d); d = new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "Diablo")); _aiDrivers.Add(d); _track.AddDriver(d); d = new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "F512")); _aiDrivers.Add(d); _track.AddDriver(d); d = new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "ZR1")); _aiDrivers.Add(d); _track.AddDriver(d); d = new AIDriver(VehicleDescription.Descriptions.Find(a => a.Name == "NSX")); _aiDrivers.Add(d); _track.AddDriver(d); */ _raceUI = new RaceUI(_race); _race.StartCountdown(); _raceViewport = new Viewport(0, 0, 640, 400); _uiViewport = new Viewport(0, 0, 640, 480); }
private static void SlideAlongFence(DrivableVehicle car, int wheel, float collisionAngle, float direction) { if (car.AudioEnabled && Math.Abs(collisionAngle) > MathHelper.ToRadians(30)) { EnvironmentAudioProvider.Instance.PlayVehicleFenceCollision(); } // if we hit the front wheels, change the direction to almost match the fence direction. If we hit the back wheels this looks weird so // only rotate 50% of the way if (wheel < 2) { car.RotateCarAfterCollision = direction * collisionAngle * 1.1f; car.Speed *= 0.80f; } else { car.RotateCarAfterCollision = direction * collisionAngle * 0.5f; car.Speed *= 0.9f; } }
public void RenderBackground(DrivableVehicle car) { float carRpm = car.Motor.Rpm / car.Motor.RedlineRpm; Engine.Instance.SpriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.NonPremultiplied, SamplerState.LinearWrap, DepthStencilState.None, RasterizerState.CullNone); // Draw tacho Color color = new Color(255, 255, 255, 200); Engine.Instance.SpriteBatch.Draw(_tacho.Texture, new Rectangle(_tacho.Misc[2], _tacho.Misc[3], _size, _size), Color.White); float rotation = (float)(carRpm * Math.PI * 1.4f) - 2.56f; Engine.Instance.SpriteBatch.Draw(_tachLineTexture, new Vector2(_tacho.Misc[2] + _size / 2, _tacho.Misc[3] + _size / 2), null, color, rotation, new Vector2(_needleWidth/2, 25), new Vector2(1f, _needleLength), SpriteEffects.None, 0); // mini-map overlay //Engine.Instance.SpriteBatch.Draw(_map.Texture, _map.GetDisplayAt(), Color.White); // Draw bottom fill const int barHeight = 17; Engine.Instance.SpriteBatch.Draw(_bottomBar.Texture, new Vector2(0, 400), new Rectangle(0, 0, 640, barHeight), Color.White); Engine.Instance.SpriteBatch.Draw(_bottomFill.Texture, new Vector2(0, 400 + barHeight), new Rectangle(0, 0, 640, 60), Color.White); Engine.Instance.SpriteBatch.End(); }
public PlayerDriver(DrivableVehicle vehicle) { _vehicle = vehicle; }
public DebugView(DrivableVehicle car) { _car = car; _camera = new FPSCamera(); }
public RacingAIDriver(VehicleDescription vehicleDescriptor) { _vehicle = new DrivableVehicle(vehicleDescriptor); _vehicle.SteeringSpeed = 6; _vehicle.AutoDrift = false; Vehicle = _vehicle; _firstLaneChangeAllowed = Engine.Instance.Random.Next(5, 40); }
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; } }
private static void SlideAlongFence(DrivableVehicle car, int wheel, float collisionAngle, float direction) { if (car.AudioEnabled && Math.Abs(collisionAngle) > MathHelper.ToRadians(30)) { EnvironmentAudioProvider.Instance.PlayVehicleFenceCollision(); } // if we hit the front wheels, change the direction to almost match the fence direction. If we hit the back wheels this looks weird so // only rotate 50% of the way if (wheel < 2) { car.RotateCarAfterCollision = direction * collisionAngle * 1.1f; car.Speed *= 0.80f; } else { car.RotateCarAfterCollision = direction * collisionAngle *0.5f; car.Speed *= 0.9f; } }
private static void HandleHeadOnCrash(DrivableVehicle car, int wheel, float collisionAngle) { if (car.AudioEnabled) { EnvironmentAudioProvider.Instance.PlayVehicleFenceCollision(); } // Also rotate car if less than 60 degrees if (Math.Abs(collisionAngle) < MathHelper.Pi / 3.0f) car.RotateCarAfterCollision = +collisionAngle / 3.0f; //bounce back a little car.Speed *= -0.15f; }
public VehicleAudioProvider2(DrivableVehicle car) { _car = car; }