예제 #1
0
        private void UpdateSteeringAngle(float deltaTime)
        {
            // TODO: Reduce max steering angle at high speeds.

            const float MaxAngle     = 0.5f;
            const float SteeringRate = 3;

            // We limit the amount of change per frame.
            float change = SteeringRate * deltaTime;

            float direction = 0;

            if (_inputService.IsDown(Keys.A))
            {
                direction += 1;
            }
            if (_inputService.IsDown(Keys.D))
            {
                direction -= 1;
            }

            var gamePadState = _inputService.GetGamePadState(LogicalPlayerIndex.One);

            direction -= gamePadState.ThumbSticks.Left.X;

            if (direction != 0)
            {
                // Increase steering angle.
                _steeringAngle = MathHelper.Clamp(_steeringAngle + direction * change, -MaxAngle, +MaxAngle);
            }
            else
            {
                // Steer back to neutral position (angle 0).
                if (_steeringAngle > 0)
                {
                    _steeringAngle = MathHelper.Clamp(_steeringAngle - change, 0, +MaxAngle);
                }
                else if (_steeringAngle < 0)
                {
                    _steeringAngle = MathHelper.Clamp(_steeringAngle + change, -MaxAngle, 0);
                }

                // TODO: Maybe we steer back with half rate?
                // (Pressing a button steers faster than not pressing a button?)
            }

            VehicleHelper.SetCarSteeringAngle(_steeringAngle, Vehicle.Wheels[0], Vehicle.Wheels[1], Vehicle.Wheels[2], Vehicle.Wheels[3]);
        }