Add reset mechanic when out of bounds
parent
0b46991f45
commit
f7bd4f6880
|
@ -14,6 +14,11 @@ _global_script_classes=[ {
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://scenes/base_track_level.gd"
|
"path": "res://scenes/base_track_level.gd"
|
||||||
}, {
|
}, {
|
||||||
|
"base": "VehicleBody",
|
||||||
|
"class": "BuggedVehicle",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://vehicles/vehicle.gd"
|
||||||
|
}, {
|
||||||
"base": "Particles",
|
"base": "Particles",
|
||||||
"class": "TireSmoke",
|
"class": "TireSmoke",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
|
@ -26,6 +31,7 @@ _global_script_classes=[ {
|
||||||
} ]
|
} ]
|
||||||
_global_script_class_icons={
|
_global_script_class_icons={
|
||||||
"BaseTrackLevel": "",
|
"BaseTrackLevel": "",
|
||||||
|
"BuggedVehicle": "",
|
||||||
"TireSmoke": "",
|
"TireSmoke": "",
|
||||||
"Track": ""
|
"Track": ""
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,19 +3,32 @@ extends Spatial
|
||||||
|
|
||||||
const camera = preload("res://player/camera.tscn")
|
const camera = preload("res://player/camera.tscn")
|
||||||
onready var spawn_point = $PlayerSpawnLocation
|
onready var spawn_point = $PlayerSpawnLocation
|
||||||
|
onready var track = $Track
|
||||||
var player_node: Node
|
var player_node: Node
|
||||||
var gui: Node
|
var gui: Node
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
player_node.global_transform = spawn_point.global_transform
|
player_node.global_transform = spawn_point.global_transform
|
||||||
add_child(player_node)
|
add_child(player_node)
|
||||||
add_child(gui)
|
add_child(gui)
|
||||||
var player_camera = camera.instance()
|
var player_camera = camera.instance()
|
||||||
player_camera.global_transform = spawn_point.global_transform
|
player_camera.global_transform = spawn_point.global_transform
|
||||||
player_camera.global_transform.origin = -spawn_point.global_transform.basis.z * 1000
|
player_camera.global_transform.origin -= spawn_point.global_transform.basis.z * 1000
|
||||||
player_camera.follow_target_path = player_node.get_path()
|
player_camera.follow_target_path = player_node.get_path()
|
||||||
add_child(player_camera)
|
add_child(player_camera)
|
||||||
|
|
||||||
|
|
||||||
func spawn_player(player_node: Node, gui: Node) -> void:
|
func spawn_player(player_node: Node, gui: Node) -> void:
|
||||||
self.player_node = player_node
|
self.player_node = player_node
|
||||||
self.gui = gui
|
self.gui = gui
|
||||||
|
|
||||||
|
|
||||||
|
func reset_player_to(node_to_reset_to: Node, player_node: BuggedVehicle) -> void:
|
||||||
|
player_node.reset_transform = node_to_reset_to.global_transform
|
||||||
|
player_node.reset_transform.origin += node_to_reset_to.global_transform.basis.y * 15
|
||||||
|
|
||||||
|
|
||||||
|
func _on_ResetArea_body_entered(body: Node) -> void:
|
||||||
|
if body.get_groups().has("car"):
|
||||||
|
reset_player_to(track.get_last_checkpoint(), body)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=9 format=2]
|
[gd_scene load_steps=10 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scenes/base_track_level.tscn" type="PackedScene" id=1]
|
[ext_resource path="res://scenes/base_track_level.tscn" type="PackedScene" id=1]
|
||||||
[ext_resource path="res://assets/dirttrack.png" type="Texture" id=2]
|
[ext_resource path="res://assets/dirttrack.png" type="Texture" id=2]
|
||||||
|
@ -76,6 +76,9 @@ albedo_color = Color( 0.0862745, 0.929412, 0.858824, 1 )
|
||||||
material = SubResource( 2 )
|
material = SubResource( 2 )
|
||||||
flip_faces = true
|
flip_faces = true
|
||||||
|
|
||||||
|
[sub_resource type="BoxShape" id=8]
|
||||||
|
extents = Vector3( 226.72, 25.6138, 197.933 )
|
||||||
|
|
||||||
[node name="Spatial" instance=ExtResource( 1 )]
|
[node name="Spatial" instance=ExtResource( 1 )]
|
||||||
|
|
||||||
[node name="PlayerSpawnLocation" parent="." index="1"]
|
[node name="PlayerSpawnLocation" parent="." index="1"]
|
||||||
|
@ -124,3 +127,11 @@ material = SubResource( 7 )
|
||||||
transform = Transform( 224.434, 0, 0, 0, 224.434, 0, 0, 0, 224.434, 0, 0, 0 )
|
transform = Transform( 224.434, 0, 0, 0, 224.434, 0, 0, 0, 224.434, 0, 0, 0 )
|
||||||
mesh = SubResource( 3 )
|
mesh = SubResource( 3 )
|
||||||
material/0 = null
|
material/0 = null
|
||||||
|
|
||||||
|
[node name="ResetArea" type="Area" parent="." index="5"]
|
||||||
|
|
||||||
|
[node name="CollisionShape" type="CollisionShape" parent="ResetArea" index="0"]
|
||||||
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -106.576, 0 )
|
||||||
|
shape = SubResource( 8 )
|
||||||
|
|
||||||
|
[connection signal="body_entered" from="ResetArea" to="." method="_on_ResetArea_body_entered"]
|
||||||
|
|
|
@ -18,6 +18,9 @@ var last_checkpoint = -1
|
||||||
var start_time = 0
|
var start_time = 0
|
||||||
var current_time = 0
|
var current_time = 0
|
||||||
|
|
||||||
|
func get_last_checkpoint() -> Node:
|
||||||
|
return checkpoints.get_child(max(0, last_checkpoint))
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
start_time = OS.get_ticks_msec()
|
start_time = OS.get_ticks_msec()
|
||||||
var length = path.curve.get_baked_length()
|
var length = path.curve.get_baked_length()
|
||||||
|
|
|
@ -1,34 +1,35 @@
|
||||||
|
class_name BuggedVehicle
|
||||||
extends VehicleBody
|
extends VehicleBody
|
||||||
|
|
||||||
signal speed_updated(speed_kph, speed_percent)
|
signal speed_updated(speed_kph, speed_percent)
|
||||||
signal rpm_updated(rpm, rpm_percent)
|
signal rpm_updated(rpm, rpm_percent)
|
||||||
signal gear_updated(gear)
|
signal gear_updated(gear)
|
||||||
|
|
||||||
export (float) var MAX_STEER_ANGLE = 25
|
export(float) var MAX_STEER_ANGLE = 25
|
||||||
export (float) var SPEED_STEER_ANGLE = 10
|
export(float) var SPEED_STEER_ANGLE = 10
|
||||||
export (float) var MAX_STEER_SPEED = 100.0
|
export(float) var MAX_STEER_SPEED = 100.0
|
||||||
export (float) var MAX_STEER_INPUT = 80.0
|
export(float) var MAX_STEER_INPUT = 80.0
|
||||||
|
|
||||||
onready var max_steer_angle_rad: float = deg2rad(MAX_STEER_ANGLE)
|
onready var max_steer_angle_rad: float = deg2rad(MAX_STEER_ANGLE)
|
||||||
onready var speed_steer_angle_rad: float = deg2rad(SPEED_STEER_ANGLE)
|
onready var speed_steer_angle_rad: float = deg2rad(SPEED_STEER_ANGLE)
|
||||||
onready var max_steer_input_rad: float = deg2rad(MAX_STEER_INPUT)
|
onready var max_steer_input_rad: float = deg2rad(MAX_STEER_INPUT)
|
||||||
export (Curve) var steer_curve = null
|
export(Curve) var steer_curve = null
|
||||||
|
|
||||||
export (float) var MAX_ENGINE_FORCE = 85.0
|
export(float) var MAX_ENGINE_FORCE = 85.0
|
||||||
export (float) var MAX_BRAKE_FORCE = 50.0
|
export(float) var MAX_BRAKE_FORCE = 50.0
|
||||||
export (float) var THROTTLE_POWER = 6000.0
|
export(float) var THROTTLE_POWER = 6000.0
|
||||||
export (float) var MAX_RPM_LOSS_PS = 3000.0
|
export(float) var MAX_RPM_LOSS_PS = 3000.0
|
||||||
export (float) var BASE_ENGINE_PITCH = 0.5
|
export(float) var BASE_ENGINE_PITCH = 0.5
|
||||||
export (float) var EXPECTED_MAX_SPEED = 200
|
export(float) var EXPECTED_MAX_SPEED = 200
|
||||||
|
|
||||||
export (Array) var gear_ratios = [ 3.4, 2.5, 2.0, 1.5, 1.25 ]
|
export(Array) var gear_ratios = [3.4, 2.5, 2.0, 1.5, 1.25]
|
||||||
export (float) var reverse_ratio = -3
|
export(float) var reverse_ratio = -3
|
||||||
export (float) var final_drive = 3.45
|
export(float) var final_drive = 3.45
|
||||||
export (float) var max_rpm = 3500
|
export(float) var max_rpm = 3500
|
||||||
export (float) var min_rpm = 900
|
export(float) var min_rpm = 900
|
||||||
export (float) var gear_switch_time = 0.2
|
export(float) var gear_switch_time = 0.2
|
||||||
export (Curve) var power_curve = null
|
export(Curve) var power_curve = null
|
||||||
export (Curve) var sound_curve = null
|
export(Curve) var sound_curve = null
|
||||||
|
|
||||||
var clutch_position: float = 0.0
|
var clutch_position: float = 0.0
|
||||||
var rpm = 0
|
var rpm = 0
|
||||||
|
@ -49,6 +50,8 @@ onready var engine_sound_player: AudioStreamPlayer3D = $engine_sound_player
|
||||||
onready var engine_sound_playback: AudioStreamPlayback = $engine_sound_player.get_stream_playback()
|
onready var engine_sound_playback: AudioStreamPlayback = $engine_sound_player.get_stream_playback()
|
||||||
|
|
||||||
var traction_wheels: Array
|
var traction_wheels: Array
|
||||||
|
var reset_transform: Transform = Transform.IDENTITY
|
||||||
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
for wheel in [frwheel, flwheel, rrwheel, rlwheel]:
|
for wheel in [frwheel, flwheel, rrwheel, rlwheel]:
|
||||||
|
@ -58,6 +61,11 @@ func _ready():
|
||||||
_generate_engine_sound(0)
|
_generate_engine_sound(0)
|
||||||
engine_sound_player.play()
|
engine_sound_player.play()
|
||||||
|
|
||||||
|
func _integrate_forces(state: PhysicsDirectBodyState) -> void:
|
||||||
|
if reset_transform != Transform.IDENTITY:
|
||||||
|
state.set_transform(reset_transform)
|
||||||
|
reset_transform = Transform.IDENTITY
|
||||||
|
|
||||||
func _get_gear_ratio():
|
func _get_gear_ratio():
|
||||||
if gear == 0:
|
if gear == 0:
|
||||||
return 0
|
return 0
|
||||||
|
@ -66,6 +74,7 @@ func _get_gear_ratio():
|
||||||
else:
|
else:
|
||||||
return gear_ratios[gear - 1]
|
return gear_ratios[gear - 1]
|
||||||
|
|
||||||
|
|
||||||
func _handle_gear_switch(delta: float):
|
func _handle_gear_switch(delta: float):
|
||||||
if gear_timer > 0:
|
if gear_timer > 0:
|
||||||
gear_timer = max(0, gear_timer - delta)
|
gear_timer = max(0, gear_timer - delta)
|
||||||
|
@ -81,23 +90,31 @@ func _handle_gear_switch(delta: float):
|
||||||
gear_timer = gear_switch_time * (2 - clutch_position)
|
gear_timer = gear_switch_time * (2 - clutch_position)
|
||||||
emit_signal("gear_updated", gear)
|
emit_signal("gear_updated", gear)
|
||||||
|
|
||||||
|
|
||||||
func _has_traction():
|
func _has_traction():
|
||||||
for wheel in traction_wheels:
|
for wheel in traction_wheels:
|
||||||
if wheel.is_in_contact():
|
if wheel.is_in_contact():
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
|
||||||
func _update_wheels_smoke():
|
func _update_wheels_smoke():
|
||||||
for wheelnsmoke in [[frwheel, frsmoke], [flwheel, flsmoke], [rrwheel, rrsmoke], [rlwheel, rlsmoke]]:
|
for wheelnsmoke in [
|
||||||
|
[frwheel, frsmoke], [flwheel, flsmoke], [rrwheel, rrsmoke], [rlwheel, rlsmoke]
|
||||||
|
]:
|
||||||
wheelnsmoke[1].update(wheelnsmoke[0].get_skidinfo())
|
wheelnsmoke[1].update(wheelnsmoke[0].get_skidinfo())
|
||||||
|
|
||||||
|
|
||||||
func _lerp_rpm(from, to, delta, factor):
|
func _lerp_rpm(from, to, delta, factor):
|
||||||
var new_val = lerp(from, to, factor)
|
var new_val = lerp(from, to, factor)
|
||||||
if abs(from - new_val) > MAX_RPM_LOSS_PS * delta:
|
if abs(from - new_val) > MAX_RPM_LOSS_PS * delta:
|
||||||
var new_factor = inverse_lerp(from, to, from - sign(from - new_val) * MAX_RPM_LOSS_PS * delta)
|
var new_factor = inverse_lerp(
|
||||||
|
from, to, from - sign(from - new_val) * MAX_RPM_LOSS_PS * delta
|
||||||
|
)
|
||||||
new_val = lerp(from, to, new_factor)
|
new_val = lerp(from, to, new_factor)
|
||||||
return new_val
|
return new_val
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float):
|
func _physics_process(delta: float):
|
||||||
_update_wheels_smoke()
|
_update_wheels_smoke()
|
||||||
clutch_position = Input.get_action_strength("clutch")
|
clutch_position = Input.get_action_strength("clutch")
|
||||||
|
@ -142,7 +159,10 @@ func _physics_process(delta: float):
|
||||||
emit_signal("speed_updated", speed, speed / EXPECTED_MAX_SPEED)
|
emit_signal("speed_updated", speed, speed / EXPECTED_MAX_SPEED)
|
||||||
emit_signal("rpm_updated", rpm, rpm_factor)
|
emit_signal("rpm_updated", rpm, rpm_factor)
|
||||||
|
|
||||||
var steering_input = Input.get_action_strength("steer_left") - Input.get_action_strength("steer_right")
|
var steering_input = (
|
||||||
|
Input.get_action_strength("steer_left")
|
||||||
|
- Input.get_action_strength("steer_right")
|
||||||
|
)
|
||||||
if abs(steering_input) < 0.05:
|
if abs(steering_input) < 0.05:
|
||||||
steering_input = 0.0
|
steering_input = 0.0
|
||||||
elif steer_curve:
|
elif steer_curve:
|
||||||
|
@ -155,6 +175,7 @@ func _physics_process(delta: float):
|
||||||
|
|
||||||
steering = steering_input * lerp(max_steer_angle_rad, speed_steer_angle_rad, steer_speed_factor)
|
steering = steering_input * lerp(max_steer_angle_rad, speed_steer_angle_rad, steer_speed_factor)
|
||||||
|
|
||||||
|
|
||||||
func _generate_engine_sound(rpm_factor):
|
func _generate_engine_sound(rpm_factor):
|
||||||
engine_sound_player.pitch_scale = BASE_ENGINE_PITCH + 2 * rpm_factor
|
engine_sound_player.pitch_scale = BASE_ENGINE_PITCH + 2 * rpm_factor
|
||||||
var to_fill = engine_sound_playback.get_frames_available()
|
var to_fill = engine_sound_playback.get_frames_available()
|
||||||
|
@ -165,6 +186,11 @@ func _generate_engine_sound(rpm_factor):
|
||||||
var fill_percent = 0.0
|
var fill_percent = 0.0
|
||||||
while to_fill > 0:
|
while to_fill > 0:
|
||||||
engine_sound_playback.push_frame(Vector2(1.0, 1.0) * factor)
|
engine_sound_playback.push_frame(Vector2(1.0, 1.0) * factor)
|
||||||
factor += cos(factor) * sin(factor) * (1 + to_fill % 2) * ((sound_curve.interpolate_baked(fill_percent) - 0.5) * 2)
|
factor += (
|
||||||
|
cos(factor)
|
||||||
|
* sin(factor)
|
||||||
|
* (1 + to_fill % 2)
|
||||||
|
* ((sound_curve.interpolate_baked(fill_percent) - 0.5) * 2)
|
||||||
|
)
|
||||||
to_fill -= 1
|
to_fill -= 1
|
||||||
fill_percent += fill_segment
|
fill_percent += fill_segment
|
||||||
|
|
Loading…
Reference in New Issue