diff --git a/player/vehicle_controller.gd b/player/vehicle_controller.gd new file mode 100644 index 0000000..bb0538f --- /dev/null +++ b/player/vehicle_controller.gd @@ -0,0 +1,28 @@ +class_name PlayerVehicleController +extends Node + +export(NodePath) var vehicle_path = null + +onready var _vehicle: BuggedVehicle = get_node(vehicle_path) + + +func _input(_event: InputEvent) -> void: + # Using _input just to make sure events are captured right away + _vehicle.inputs.throttle = Input.get_action_strength("throttle") + _vehicle.inputs.clutch = Input.get_action_strength("clutch") + _vehicle.inputs.brake = Input.get_action_strength("brake") + _vehicle.inputs.handbrake = Input.get_action_strength("handbrake") + var steering_input = ( + Input.get_action_strength("steer_left") + - Input.get_action_strength("steer_right") + ) + # TODO: deadzone config + if abs(steering_input) < 0.05: + steering_input = 0.0 + _vehicle.inputs.steering = steering_input + if Input.is_action_just_pressed("gear_up"): + _vehicle.inputs.gear_request = BuggedVehicle.GearRequest.UP + elif Input.is_action_pressed("gear_down"): + _vehicle.inputs.gear_request = BuggedVehicle.GearRequest.DOWN + else: + _vehicle.inputs.gear_request = BuggedVehicle.GearRequest.NONE diff --git a/project.godot b/project.godot index 8d9ec1e..2d9fe61 100644 --- a/project.godot +++ b/project.godot @@ -24,6 +24,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://player/cameras/camera_controller.gd" }, { +"base": "Node", +"class": "PlayerVehicleController", +"language": "GDScript", +"path": "res://player/vehicle_controller.gd" +}, { "base": "Particles", "class": "TireSmoke", "language": "GDScript", @@ -38,6 +43,7 @@ _global_script_class_icons={ "BaseTrackLevel": "", "BuggedVehicle": "", "CameraController": "", +"PlayerVehicleController": "", "TireSmoke": "", "Track": "" } diff --git a/scenes/base_track_level.gd b/scenes/base_track_level.gd index 970306f..41cd8ea 100644 --- a/scenes/base_track_level.gd +++ b/scenes/base_track_level.gd @@ -2,10 +2,12 @@ class_name BaseTrackLevel extends Spatial const CAMERA_CONTROLLER = preload("res://player/cameras/camera_controller.gd") +const PLAYER_CONTROLLER = preload("res://player/vehicle_controller.gd") var player_node: BuggedVehicle var gui: Node var camera_controller: CameraController +var player_controller: PlayerVehicleController onready var track = $Track @@ -14,12 +16,16 @@ func _ready() -> void: reset_player_to(track.get_furthest_checkpoint(), player_node) add_child(player_node) add_child(gui) + player_controller = PLAYER_CONTROLLER.new() + player_controller.vehicle_path = player_node.get_path() + player_node.add_child(player_controller) camera_controller = CAMERA_CONTROLLER.new() camera_controller.attach_cameras_to(player_node) func spawn_player(player_node: BuggedVehicle, gui: Node) -> void: self.player_node = player_node + self.player_node.add_child(player_controller) self.gui = gui diff --git a/vehicles/vehicle.gd b/vehicles/vehicle.gd index 0632149..5a1bfac 100644 --- a/vehicles/vehicle.gd +++ b/vehicles/vehicle.gd @@ -9,6 +9,8 @@ signal clutch_updated(clutch_percent) signal gear_updated(gear) signal steering_updated(steering_angle, steering_percent) +enum GearRequest { NONE, UP, DOWN } + export(float) var max_steer_angle = 25 export(float) var speed_steer_angle = 10 export(float) var max_steer_speed = 100.0 @@ -42,6 +44,8 @@ var gear_timer = 0 var traction_wheels: Array var reset_transform: Transform = Transform.IDENTITY +var inputs: VehicleInputs = VehicleInputs.new() + onready var frwheel: VehicleWheel = $front_right onready var flwheel: VehicleWheel = $front_left onready var rrwheel: VehicleWheel = $rear_right @@ -51,11 +55,6 @@ onready var flsmoke: TireSmoke = $fl_tire_smoke onready var rrsmoke: TireSmoke = $rr_tire_smoke onready var rlsmoke: TireSmoke = $rl_tire_smoke -onready var cockpit: Position3D = $cockpit -onready var hood: Position3D = $hood -onready var bumper: Position3D = $bumper -onready var static_follow: Position3D = $static_follow - onready var engine_sound_player: AudioStreamPlayer3D = $engine_sound_player onready var engine_sound_playback: AudioStreamPlayback = $engine_sound_player.get_stream_playback() @@ -66,6 +65,16 @@ onready var max_steer_input_rad: float = deg2rad(max_steer_input) onready var auto_clutch_rpm_limit = max_rpm * automatic_gear_down_threshold +class VehicleInputs: + var gear_request = GearRequest.NONE + var clutch = 0.0 + var throttle = 0.0 + var brake = 0.0 + var handbrake = 0.0 + # Left is positive, right is negative + var steering = 0.0 + + func _ready(): for wheel in [frwheel, flwheel, rrwheel, rlwheel]: if wheel.use_as_traction: @@ -76,19 +85,19 @@ func _ready(): func get_cockpit_position() -> Node: - return cockpit + return $cockpit func get_hood_position() -> Node: - return hood + return $hood func get_bumper_position() -> Node: - return bumper + return $bumper func get_static_follow_position() -> Node: - return static_follow + return $static_follow func _integrate_forces(state: PhysicsDirectBodyState) -> void: @@ -112,10 +121,11 @@ func _handle_gear_switch(delta: float): if gear_timer > 0: gear_timer = max(0, gear_timer - delta) if clutch_position > 0.8 or GlobalSettings.auto_clutch or GlobalSettings.automatic_transmission: - if Input.is_action_just_pressed("gear_up"): - _gear_up() - if Input.is_action_just_pressed("gear_down"): - _gear_down() + match inputs.gear_request: + GearRequest.UP: + _gear_up() + GearRequest.DOWN: + _gear_down() func _gear_up(): @@ -158,10 +168,10 @@ func _lerp_rpm(from, to, delta, factor): func _physics_process(delta: float): _update_wheels_smoke() - clutch_position = Input.get_action_strength("clutch") + clutch_position = inputs.clutch _handle_gear_switch(delta) - var throttle = Input.get_action_strength("throttle") - var brake_input = Input.get_action_strength("brake") + var throttle = inputs.throttle + var brake_input = inputs.brake var wheel_rpm = traction_wheels[0].get_rpm() var speed = wheel_rpm * 2.0 * PI * rrwheel.wheel_radius / 60.0 * 3600.0 / 1000.0 @@ -215,7 +225,7 @@ func _physics_process(delta: float): brake = brake_input * max_brake_force engine_force = throttle * final_input * max_engine_force - var handbrake = Input.get_action_strength("handbrake") + var handbrake = inputs.handbrake rrwheel.brake = handbrake * max_brake_force rlwheel.brake = handbrake * max_brake_force @@ -228,12 +238,7 @@ func _physics_process(delta: float): emit_signal("speed_updated", speed, speed / expected_max_speed) emit_signal("rpm_updated", rpm, rpm_factor) - var steering_input = ( - Input.get_action_strength("steer_left") - - Input.get_action_strength("steer_right") - ) - if abs(steering_input) < 0.05: - steering_input = 0.0 + var steering_input = inputs.steering var steer_speed_factor = clamp(speed / max_steer_speed, 0.0, 1.0)