Ejemplo n.º 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);
        }
Ejemplo n.º 2
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;
        }
Ejemplo n.º 3
0
 public BumperView(DrivableVehicle car)
 {
     _car = car;
     _camera = new SimpleCamera();
     _camera.FieldOfView = GameConfig.FOV;
     _camera.FarPlaneDistance = GameConfig.DrawDistance;
 }
Ejemplo n.º 4
0
 public DropCameraView(DrivableVehicle car)
 {
     _car = car;
     _camera = new SimpleCamera();
     _camera.FieldOfView = GameConfig.FOV;
     _camera.FarPlaneDistance = GameConfig.DrawDistance;
     PositionCameraAtNode(car.Track.RoadNodes[10]);
 }
Ejemplo n.º 5
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;
            }
        }
Ejemplo n.º 6
0
 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);
 }
Ejemplo n.º 7
0
 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;
 }
Ejemplo n.º 8
0
 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);
 }
Ejemplo n.º 9
0
        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();
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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;
        }
Ejemplo n.º 12
0
        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;
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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;
            }
        }
Ejemplo n.º 15
0
        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();
        }
Ejemplo n.º 16
0
 public PlayerDriver(DrivableVehicle vehicle)
 {
     _vehicle = vehicle;
 }
Ejemplo n.º 17
0
 public DebugView(DrivableVehicle car)
 {
     _car = car;
     _camera = new FPSCamera();
 }
Ejemplo n.º 18
0
 public RacingAIDriver(VehicleDescription vehicleDescriptor)
 {
     _vehicle = new DrivableVehicle(vehicleDescriptor);
     _vehicle.SteeringSpeed = 6;
     _vehicle.AutoDrift = false;
     Vehicle = _vehicle;
     _firstLaneChangeAllowed = Engine.Instance.Random.Next(5, 40);
 }
Ejemplo n.º 19
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;
            }
        }
Ejemplo n.º 20
0
        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;
            }
        }
Ejemplo n.º 21
0
        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;
        }
Ejemplo n.º 22
0
 public VehicleAudioProvider2(DrivableVehicle car)
 {
     _car = car;
 }