From 74261243991466ff5fad3956c3bddb3e0bdf43d6 Mon Sep 17 00:00:00 2001 From: Lurkars Date: Fri, 12 Jul 2019 11:07:42 +0200 Subject: [PATCH] fixed path reset rotation --- project.godot | 12 +- scenes/lobby/lobby.tscn | 2 +- ...asePathPlayer.tscn => PathPlayerBase.tscn} | 2 +- scenes/player/PathPlayerBot.tscn | 6 + scenes/player/camera.tscn | 6 - scenes/road/roadCornerLarge.tscn | 3 +- scenes/road/roadCornerLargeFlipped.tscn | 2 +- scenes/road/roadCornerLarger.tscn | 2 +- scenes/road/roadCornerLargerFlipped.tscn | 2 +- scenes/road/roadCornerSmall.tscn | 2 +- scenes/road/roadCornerSmallFlipped.tscn | 2 +- scripts/camera/camera_control.gd | 208 ------------ scripts/camera/camera_control_gui.gd | 296 ------------------ scripts/game/game_state.gd | 20 +- scripts/game/preview.gd | 4 +- scripts/game/route.gd | 4 +- .../{BasePathPlayer.gd => PathPlayerBase.gd} | 45 ++- scripts/player/PathPlayerBot.gd | 46 +++ scripts/player/PathPlayerControls.gd | 4 +- scripts/player/PathPlayerWheelRotation.gd | 19 -- scripts/road/road.gd | 10 +- 21 files changed, 111 insertions(+), 586 deletions(-) rename scenes/player/{BasePathPlayer.tscn => PathPlayerBase.tscn} (98%) create mode 100644 scenes/player/PathPlayerBot.tscn delete mode 100644 scenes/player/camera.tscn delete mode 100644 scripts/camera/camera_control.gd delete mode 100644 scripts/camera/camera_control_gui.gd rename scripts/player/{BasePathPlayer.gd => PathPlayerBase.gd} (75%) create mode 100644 scripts/player/PathPlayerBot.gd delete mode 100644 scripts/player/PathPlayerWheelRotation.gd diff --git a/project.godot b/project.godot index b6781bc..8211b47 100644 --- a/project.godot +++ b/project.godot @@ -9,16 +9,16 @@ config_version=4 _global_script_classes=[ { -"base": "Player", -"class": "BasePathPlayer", -"language": "GDScript", -"path": "res://scripts/player/BasePathPlayer.gd" -}, { "base": "Spatial", "class": "Inventory", "language": "GDScript", "path": "res://scripts/player/inventory.gd" }, { +"base": "Player", +"class": "PathPlayerBase", +"language": "GDScript", +"path": "res://scripts/player/PathPlayerBase.gd" +}, { "base": "Node", "class": "Player", "language": "GDScript", @@ -50,8 +50,8 @@ _global_script_classes=[ { "path": "res://scripts/Util.gd" } ] _global_script_class_icons={ -"BasePathPlayer": "", "Inventory": "", +"PathPlayerBase": "", "Player": "", "Preview": "", "Road": "", diff --git a/scenes/lobby/lobby.tscn b/scenes/lobby/lobby.tscn index 33e12ae..580bc20 100644 --- a/scenes/lobby/lobby.tscn +++ b/scenes/lobby/lobby.tscn @@ -48,7 +48,6 @@ size_flags_horizontal = 2 size_flags_vertical = 2 [node name="connect" type="Panel" parent="."] -editor/display_folded = true margin_left = 370.0 margin_top = 157.0 margin_right = 647.0 @@ -130,6 +129,7 @@ size_flags_vertical = 2 text = "Join" [node name="full" type="CheckBox" parent="connect"] +visible = false margin_left = 18.0 margin_top = 182.0 margin_right = 69.0 diff --git a/scenes/player/BasePathPlayer.tscn b/scenes/player/PathPlayerBase.tscn similarity index 98% rename from scenes/player/BasePathPlayer.tscn rename to scenes/player/PathPlayerBase.tscn index 793ada2..2d3b6b9 100644 --- a/scenes/player/BasePathPlayer.tscn +++ b/scenes/player/PathPlayerBase.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=2] -[ext_resource path="res://scripts/player/BasePathPlayer.gd" type="Script" id=1] +[ext_resource path="res://scripts/player/PathPlayerBase.gd" type="Script" id=1] [ext_resource path="res://scripts/player/raceCar.gd" type="Script" id=2] [ext_resource path="res://assets/raceCar/body.obj" type="ArrayMesh" id=3] [ext_resource path="res://assets/raceCar/wheel.obj" type="ArrayMesh" id=4] diff --git a/scenes/player/PathPlayerBot.tscn b/scenes/player/PathPlayerBot.tscn new file mode 100644 index 0000000..8a884b7 --- /dev/null +++ b/scenes/player/PathPlayerBot.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scripts/player/PathPlayerBot.gd" type="Script" id=1] + +[node name="PlayerControls" type="Spatial"] +script = ExtResource( 1 ) diff --git a/scenes/player/camera.tscn b/scenes/player/camera.tscn deleted file mode 100644 index 56bda1d..0000000 --- a/scenes/player/camera.tscn +++ /dev/null @@ -1,6 +0,0 @@ -[gd_scene format=2] - -[node name="InterpolatedCamera" type="InterpolatedCamera"] -h_offset = 0.5 -v_offset = 0.5 -enabled = true diff --git a/scenes/road/roadCornerLarge.tscn b/scenes/road/roadCornerLarge.tscn index 7269136..587c5a4 100644 --- a/scenes/road/roadCornerLarge.tscn +++ b/scenes/road/roadCornerLarge.tscn @@ -10,8 +10,7 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) -end_rotation_axis = Vector3( 0, 1, 0 ) -end_rotation_phi = -1.571 +end_rotation = Vector3( 0, -1.571, 0 ) speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 ) force_penalties = PoolVector3Array( 0, 0, 50 ) torque_penalties = PoolVector3Array( 0, 0, 2 ) diff --git a/scenes/road/roadCornerLargeFlipped.tscn b/scenes/road/roadCornerLargeFlipped.tscn index 04bafa8..44a389b 100644 --- a/scenes/road/roadCornerLargeFlipped.tscn +++ b/scenes/road/roadCornerLargeFlipped.tscn @@ -10,7 +10,7 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) -end_rotation_axis = Vector3( 0, 1, 0 ) +end_rotation = Vector3( 0, 1.571, 0 ) end_rotation_phi = 1.571 speed_constrains = PoolVector3Array( 0.2, 0.6, 0.13, 0.6, 1.5, 0.1, 1.5, 2.36, 0.13 ) force_penalties = PoolVector3Array( 0, 0, 50 ) diff --git a/scenes/road/roadCornerLarger.tscn b/scenes/road/roadCornerLarger.tscn index d1a5650..2c803c6 100644 --- a/scenes/road/roadCornerLarger.tscn +++ b/scenes/road/roadCornerLarger.tscn @@ -10,7 +10,7 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) -end_rotation_axis = Vector3( 0, 1, 0 ) +end_rotation = Vector3( 0, -1.571, 0 ) end_rotation_phi = -1.571 speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 ) force_penalties = PoolVector3Array( 0, 0, 50 ) diff --git a/scenes/road/roadCornerLargerFlipped.tscn b/scenes/road/roadCornerLargerFlipped.tscn index 7e21fb9..769788d 100644 --- a/scenes/road/roadCornerLargerFlipped.tscn +++ b/scenes/road/roadCornerLargerFlipped.tscn @@ -10,7 +10,7 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) -end_rotation_axis = Vector3( 0, 1, 0 ) +end_rotation = Vector3( 0, 1.571, 0 ) end_rotation_phi = 1.571 speed_constrains = PoolVector3Array( 0.3, 1, 0.16, 1, 2.7, 0.13, 2.7, 3.93, 0.16 ) force_penalties = PoolVector3Array( 0, 0, 50 ) diff --git a/scenes/road/roadCornerSmall.tscn b/scenes/road/roadCornerSmall.tscn index 8b64042..33d40ab 100644 --- a/scenes/road/roadCornerSmall.tscn +++ b/scenes/road/roadCornerSmall.tscn @@ -10,7 +10,7 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) -end_rotation_axis = Vector3( 0, 1, 0 ) +end_rotation = Vector3( 0, -1.571, 0 ) end_rotation_phi = -1.571 speed_constrains = PoolVector3Array( 0.1, 0.97, 0.07 ) force_penalties = PoolVector3Array( 0, 0, 50 ) diff --git a/scenes/road/roadCornerSmallFlipped.tscn b/scenes/road/roadCornerSmallFlipped.tscn index 2b327aa..499114b 100644 --- a/scenes/road/roadCornerSmallFlipped.tscn +++ b/scenes/road/roadCornerSmallFlipped.tscn @@ -10,7 +10,7 @@ material/0 = null material/1 = null material/2 = null script = ExtResource( 2 ) -end_rotation_axis = Vector3( 0, 1, 0 ) +end_rotation = Vector3( 0, 1.571, 0 ) end_rotation_phi = 1.571 speed_constrains = PoolVector3Array( 0.1, 0.79, 0.07 ) force_penalties = PoolVector3Array( 0, 0, 50 ) diff --git a/scripts/camera/camera_control.gd b/scripts/camera/camera_control.gd deleted file mode 100644 index 37d0b8c..0000000 --- a/scripts/camera/camera_control.gd +++ /dev/null @@ -1,208 +0,0 @@ -# Licensed under the MIT License. -# Copyright (c) 2018 Jaccomo Lorenz (Maujoe) - -extends Camera - -# User settings: -# General settings -export var enabled = true setget set_enabled -export(int, "Visible", "Hidden", "Caputered, Confined") var mouse_mode = 2 - -# Mouslook settings -export var mouselook = true -export (float, 0.0, 1.0) var sensitivity = 0.5 -export (float, 0.0, 0.999, 0.001) var smoothness = 0.5 setget set_smoothness -export(NodePath) var privot setget set_privot -export var distance = 5.0 setget set_distance -export var rotate_privot = false -export var collisions = true setget set_collisions -export (int, 0, 360) var yaw_limit = 360 -export (int, 0, 360) var pitch_limit = 360 - -# Movement settings -export var movement = true -export (float, 0.0, 1.0) var acceleration = 1.0 -export (float, 0.0, 0.0, 1.0) var deceleration = 0.1 -export var max_speed = Vector3(1.0, 1.0, 1.0) -export var local = true -export var forward_action = "ui_up" -export var backward_action = "ui_down" -export var left_action = "ui_left" -export var right_action = "ui_right" -export var up_action = "ui_page_up" -export var down_action = "ui_page_down" - -# Gui settings -export var use_gui = true -export var gui_action = "ui_cancel" - -# Intern variables. -var _mouse_position = Vector2(0.0, 0.0) -var _yaw = 0.0 -var _pitch = 0.0 -var _total_yaw = 0.0 -var _total_pitch = 0.0 - -var _direction = Vector3(0.0, 0.0, 0.0) -var _speed = Vector3(0.0, 0.0, 0.0) -var _gui - -func _ready(): - _check_actions([forward_action, backward_action, left_action, right_action, gui_action, up_action, down_action]) - - if privot: - privot = get_node(privot) - else: - privot = null - - set_enabled(enabled) - - if use_gui: - _gui = preload("camera_control_gui.gd") - _gui = _gui.new(self, gui_action) - add_child(_gui) - -func _input(event): - if mouselook: - if event is InputEventMouseMotion: - _mouse_position = event.relative - - if movement: - if event.is_action_pressed(forward_action): - _direction.z = -1 - elif event.is_action_pressed(backward_action): - _direction.z = 1 - elif not Input.is_action_pressed(forward_action) and not Input.is_action_pressed(backward_action): - _direction.z = 0 - - if event.is_action_pressed(left_action): - _direction.x = -1 - elif event.is_action_pressed(right_action): - _direction.x = 1 - elif not Input.is_action_pressed(left_action) and not Input.is_action_pressed(right_action): - _direction.x = 0 - - if event.is_action_pressed(up_action): - _direction.y = 1 - if event.is_action_pressed(down_action): - _direction.y = -1 - elif not Input.is_action_pressed(up_action) and not Input.is_action_pressed(down_action): - _direction.y = 0 - -func _process(delta): - if privot: - _update_distance() - if mouselook: - _update_mouselook() - if movement: - _update_movement(delta) - -func _physics_process(delta): - # Called when collision are enabled - _update_distance() - if mouselook: - _update_mouselook() - - var space_state = get_world().get_direct_space_state() - var obstacle = space_state.intersect_ray(privot.get_translation(), get_translation()) - if not obstacle.empty(): - set_translation(obstacle.position) - -func _update_movement(delta): - var offset = max_speed * acceleration * _direction - - _speed.x = clamp(_speed.x + offset.x, -max_speed.x, max_speed.x) - _speed.y = clamp(_speed.y + offset.y, -max_speed.y, max_speed.y) - _speed.z = clamp(_speed.z + offset.z, -max_speed.z, max_speed.z) - - # Apply deceleration if no input - if _direction.x == 0: - _speed.x *= (1.0 - deceleration) - if _direction.y == 0: - _speed.y *= (1.0 - deceleration) - if _direction.z == 0: - _speed.z *= (1.0 - deceleration) - - if local: - translate(_speed * delta) - else: - global_translate(_speed * delta) - -func _update_mouselook(): - _mouse_position *= sensitivity - _yaw = _yaw * smoothness + _mouse_position.x * (1.0 - smoothness) - _pitch = _pitch * smoothness + _mouse_position.y * (1.0 - smoothness) - _mouse_position = Vector2(0, 0) - - if yaw_limit < 360: - _yaw = clamp(_yaw, -yaw_limit - _total_yaw, yaw_limit - _total_yaw) - if pitch_limit < 360: - _pitch = clamp(_pitch, -pitch_limit - _total_pitch, pitch_limit - _total_pitch) - - _total_yaw += _yaw - _total_pitch += _pitch - - if privot: - var target = privot.get_translation() - var offset = get_translation().distance_to(target) - - set_translation(target) - rotate_y(deg2rad(-_yaw)) - rotate_object_local(Vector3(1,0,0), deg2rad(-_pitch)) - translate(Vector3(0.0, 0.0, offset)) - - if rotate_privot: - privot.rotate_y(deg2rad(-_yaw)) - else: - rotate_y(deg2rad(-_yaw)) - rotate_object_local(Vector3(1,0,0), deg2rad(-_pitch)) - -func _update_distance(): - var t = privot.get_translation() - t.z -= distance - set_translation(t) - -func _update_process_func(): - # Use physics process if collision are enabled - if collisions and privot: - set_physics_process(true) - set_process(false) - else: - set_physics_process(false) - set_process(true) - -func _check_actions(actions=[]): - if OS.is_debug_build(): - for action in actions: - if not InputMap.has_action(action): - print('WARNING: No action "' + action + '"') - -func set_privot(value): - privot = value - # TODO: fix parenting. -# if privot: -# if get_parent(): -# get_parent().remove_child(self) -# privot.add_child(self) - _update_process_func() - -func set_collisions(value): - collisions = value - _update_process_func() - -func set_enabled(value): - enabled = value - if enabled: - Input.set_mouse_mode(mouse_mode) - set_process_input(true) - _update_process_func() - else: - set_process(false) - set_process_input(false) - set_physics_process(false) - -func set_smoothness(value): - smoothness = clamp(value, 0.001, 0.999) - -func set_distance(value): - distance = max(0, value) diff --git a/scripts/camera/camera_control_gui.gd b/scripts/camera/camera_control_gui.gd deleted file mode 100644 index 140c2aa..0000000 --- a/scripts/camera/camera_control_gui.gd +++ /dev/null @@ -1,296 +0,0 @@ -# Licensed under the MIT License. -# Copyright (c) 2018 Jaccomo Lorenz (Maujoe) - -extends Control - -# Constant Gui Settings -#******************************************************************************* -const GUI_POS = Vector2(10, 10) -const GUI_SIZE = Vector2(200, 0) -const DRAGGABLE = true - -const CUSTOM_BACKGROUND = false -const BACKGROUND_COLOR = Color(0.15, 0.17, 0.23, 0.75) - -const MAX_SPEED = 50 -#******************************************************************************* - -var camera -var shortcut -var node_list -var privot -var panel - -var mouse_over = false -var mouse_pressed = false - -func _init(camera, shortcut): - self.camera = camera - self.shortcut = shortcut - -func _ready(): - if camera.enabled: - set_process_input(true) - - # Create Gui - panel = PanelContainer.new() - panel.set_begin(GUI_POS) - panel.set_custom_minimum_size(GUI_SIZE) - - if CUSTOM_BACKGROUND: - var style = StyleBoxFlat.new() - style.set_bg_color(BACKGROUND_COLOR) - style.set_expand_margin_all(5) - panel.add_stylebox_override("panel", style) - - var container = VBoxContainer.new() - - var lbl_mouse = Label.new() - lbl_mouse.set_text("Mousemode") - - var mouse = OptionButton.new() - mouse.add_item("Visible") - mouse.add_item("Hidden") - mouse.add_item("Captured") - mouse.add_item("Confined") - mouse.select(camera.mouse_mode) - mouse.connect("item_selected",self,"_on_opt_mouse_item_selected") - - # Mouselook - var mouselook = CheckButton.new() - mouselook.set_text("Mouselook") - mouselook.set_toggle_mode(true) - mouselook.set_pressed(camera.mouselook) - mouselook.connect("toggled",self,"_on_btn_mouselook_toggled") - - var lbl_sensitivity = Label.new() - lbl_sensitivity.set_text("Sensitivity") - - var sensitivity = HScrollBar.new() - sensitivity.set_max(1) - sensitivity.set_value(camera.sensitivity) - sensitivity.connect("value_changed",self,"_on_hsb_sensitivity_value_changed") - - var lbl_smoothless = Label.new() - lbl_smoothless.set_text("Smoothness") - - var smoothness = HScrollBar.new() - smoothness.set_max(0.999) - smoothness.set_min(0.5) - smoothness.set_value(camera.smoothness) - smoothness.connect("value_changed",self,"_on_hsb_smoothness_value_changed") - - var lbl_privot = Label.new() - lbl_privot.set_text("Privot") - - privot = OptionButton.new() - privot.set_text("Privot") - _update_privots(privot) - privot.connect("item_selected",self,"_on_opt_privot_item_selected") - privot.connect("pressed",self,"_on_opt_privot_pressed") - - var btn_rot_privot = CheckButton.new() - btn_rot_privot.set_text("Rotate Privot") - btn_rot_privot.set_toggle_mode(true) - btn_rot_privot.set_pressed(camera.rotate_privot) - btn_rot_privot.connect("toggled",self,"_on_btn_rot_privot_toggled") - - var lbl_distance = Label.new() - lbl_distance.set_text("Distance") - - var distance = SpinBox.new() - distance.set_value(camera.distance) - distance.connect("value_changed",self,"_on_box_distance_value_changed") - - var lbl_yaw = Label.new() - lbl_yaw.set_text("Yaw Limit") - - var yaw = SpinBox.new() - yaw.set_max(360) - yaw.set_value(camera.yaw_limit) - yaw.connect("value_changed",self,"_on_box_yaw_value_changed") - - var lbl_pitch = Label.new() - lbl_pitch.set_text("Pitch Limit") - - var pitch = SpinBox.new() - pitch.set_max(360) - pitch.set_value(camera.pitch_limit) - pitch.connect("value_changed",self,"_on_box_pitch_value_changed") - - var collisions = CheckButton.new() - collisions.set_text("Collisions") - collisions.set_toggle_mode(true) - collisions.set_pressed(camera.collisions) - collisions.connect("toggled",self,"_on_btn_collisions_toggled") - - # Movement - var lbl_movement = Label.new() - lbl_movement.set_text("Movement") - - var movement = CheckButton.new() - movement.set_pressed(camera.movement) - movement.connect("toggled",self,"_on_btn_movement_toggled") - - var lbl_speed = Label.new() - lbl_speed.set_text("Max Speed") - - var speed = HScrollBar.new() - speed.set_max(MAX_SPEED) - speed.set_value(camera.max_speed.x) - speed.connect("value_changed",self,"_on_hsb_speed_value_changed") - - var lbl_acceleration = Label.new() - lbl_acceleration.set_text("Acceleration") - - var acceleration = HScrollBar.new() - acceleration.set_max(1.0) - acceleration.set_value(camera.acceleration) - acceleration.connect("value_changed", self, "_in_hsb_acceleration_value_changed") - - var lbl_deceleration = Label.new() - lbl_deceleration.set_text("Deceleration") - - var deceleration = HScrollBar.new() - deceleration.set_max(1.0) - deceleration.set_value(camera.deceleration) - deceleration.connect("value_changed", self, "_in_hsb_deceleration_value_changed") - - add_child(panel) - panel.add_child(container) - container.add_child(lbl_mouse) - container.add_child(mouse) - container.add_child(mouselook) - container.add_child(lbl_sensitivity) - container.add_child(sensitivity) - container.add_child(lbl_smoothless) - container.add_child(smoothness) - container.add_child(lbl_privot) - container.add_child(privot) - container.add_child(btn_rot_privot) - container.add_child(lbl_distance) - container.add_child(distance) - container.add_child(lbl_yaw) - container.add_child(yaw) - container.add_child(lbl_pitch) - container.add_child(pitch) - container.add_child(collisions) - container.add_child(lbl_movement) - container.add_child(movement) - container.add_child(lbl_speed) - container.add_child(speed) - container.add_child(lbl_acceleration) - container.add_child(acceleration) - container.add_child(lbl_deceleration) - container.add_child(deceleration) - - if DRAGGABLE: - panel.connect("mouse_entered", self, "_panel_entered") - panel.connect("mouse_exited", self, "_panel_exited") - container.connect("mouse_entered", self, "_panel_entered") - container.connect("mouse_exited", self, "_panel_exited") - - self.hide() - else: - set_process_input(false) - -func _input(event): - if event.is_action_pressed(shortcut): - if camera.enabled: - camera.enabled = false - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - self.show() - else: - camera.enabled = true - self.hide() - - if DRAGGABLE: - if event is InputEventMouseButton and event.button_index == BUTTON_LEFT: - mouse_pressed = event.pressed - - elif event is InputEventMouseMotion and mouse_over and mouse_pressed: - panel.set_begin(panel.get_begin() + event.relative) - -func _update_privots(privot): - privot.clear() - privot.add_item("None") - node_list = _get_spatials_recusiv(get_tree().get_root(), [get_name(), camera.get_name()]) - - var size = node_list.size() - for i in range(0, size): - var node = node_list[i] - privot.add_item(node.get_name()) - if node == camera.privot: - privot.select(i+1) - - if not camera.privot: - privot.select(0) - - -func _get_spatials_recusiv(node, exceptions=[]): - var list = [] - for child in node.get_children(): - if not child.get_name() in exceptions: - if child is Spatial: - list.append(child) - if not child.get_children().empty(): - for subchild in _get_spatials_recusiv(child, exceptions): - list.append(subchild) - return list - -func _panel_entered(): - mouse_over = true - -func _panel_exited(): - mouse_over = false - -func _on_opt_mouse_item_selected(id): - camera.mouse_mode = id - -func _on_btn_mouselook_toggled(pressed): - camera.mouselook = pressed - -func _on_hsb_sensitivity_value_changed(value): - camera.sensitivity = value - -func _on_hsb_smoothness_value_changed(value): - camera.smoothness = value - -func _on_opt_privot_pressed(): - _update_privots(privot) - -func _on_opt_privot_item_selected(id): - if id > 0: - camera.privot = node_list[id-1] - else: - camera.privot = null - privot.select(id) - -func _on_btn_rot_privot_toggled(pressed): - camera.rotate_privot = pressed - -func _on_box_distance_value_changed(value): - camera.distance = value - -func _on_box_yaw_value_changed(value): - camera.yaw_limit = value - -func _on_box_pitch_value_changed(value): - camera.pitch_limit = value - -func _on_btn_collisions_toggled(pressed): - camera.collisions = pressed - -func _on_btn_movement_toggled(pressed): - camera.movement = pressed - -func _on_hsb_speed_value_changed(value): - camera.max_speed.x = value - camera.max_speed.y = value - camera.max_speed.z = value - -func _in_hsb_acceleration_value_changed(value): - camera.acceleration = value - -func _in_hsb_deceleration_value_changed(value): - camera.deceleration = value diff --git a/scripts/game/game_state.gd b/scripts/game/game_state.gd index 2b8abef..2c4e093 100644 --- a/scripts/game/game_state.gd +++ b/scripts/game/game_state.gd @@ -9,10 +9,10 @@ const MAX_PEERS = MAX_PLAYERS - 1 var world_scene = preload("res://scenes/game/world.tscn") -var path_player_scene = preload("res://scenes/player/BasePathPlayer.tscn") +var path_player_scene = preload("res://scenes/player/PathPlayerBase.tscn") var path_player_controls_scene = preload("res://scenes/player/PathPlayerControls.tscn") +var path_player_bot_scene = preload("res://scenes/player/PathPlayerBot.tscn") var full_player_scene = preload("res://scenes/player/FullPlayer.tscn") -var camera_scene = preload("res://scenes/player/camera.tscn") # Name for my player var player_name = "Undefined" @@ -118,6 +118,22 @@ remote func pre_start_game(spawn_points): player.set_start(player.get_index()) + var bots = false + if bots: + for index in range(4-spawn_points.size()): + var bot_index = spawn_points.size() + index + var player = path_player_scene.instance() + player.set_name("bot_player" + str(bot_index)) + world.get_node("players").add_child(player) + if get_tree().is_network_server(): + var bot = path_player_bot_scene.instance() + bot.set_name("bot" + str(bot_index)) + world.add_child(bot) + bot.set_player(player.get_path()) + bot.set_network_master(get_tree().get_network_unique_id()) + player.set_start(bot_index) + + if (not get_tree().is_network_server()): # Tell server we are ready to start rpc_id(1, "ready_to_start", get_tree().get_network_unique_id()) diff --git a/scripts/game/preview.gd b/scripts/game/preview.gd index 2efc1e7..f8c3fac 100644 --- a/scripts/game/preview.gd +++ b/scripts/game/preview.gd @@ -19,8 +19,8 @@ func _on_route_road_added(road): var transform = road.get_global_transform(); var curve = road.get_curve() transform = transform.translated(curve.get_point_position(curve.get_point_count() -1)) - if road.get_end_rotation_phi() != 0: - transform.basis = transform.basis.rotated(road.get_end_rotation_axis(), road.get_end_rotation_phi()) + if road.get_end_rotation().length() != 0: + transform.basis = transform.basis.rotated(road.get_end_rotation().normalized(), road.get_end_rotation().length()) item.set_global_transform(transform) func _on_inventory_item_changed(road_identifier): diff --git a/scripts/game/route.gd b/scripts/game/route.gd index a4dbaf5..cb5c83b 100644 --- a/scripts/game/route.gd +++ b/scripts/game/route.gd @@ -24,8 +24,8 @@ remotesync func add_road(type, creator): transform = last_road.get_global_transform(); var curve = last_road.get_curve() transform = transform.translated(curve.get_point_position(curve.get_point_count() - 1)) - if last_road.get_end_rotation_phi() != 0: - transform.basis = transform.basis.rotated(last_road.get_end_rotation_axis(), last_road.get_end_rotation_phi()) + if last_road.get_end_rotation().length() != 0: + transform.basis = transform.basis.rotated(last_road.get_end_rotation().normalized(), last_road.get_end_rotation().length()) var new_road = roads_factory.get_road_instance(type) new_road.set_global_transform(transform) diff --git a/scripts/player/BasePathPlayer.gd b/scripts/player/PathPlayerBase.gd similarity index 75% rename from scripts/player/BasePathPlayer.gd rename to scripts/player/PathPlayerBase.gd index d4751c5..3803ce1 100644 --- a/scripts/player/BasePathPlayer.gd +++ b/scripts/player/PathPlayerBase.gd @@ -1,6 +1,6 @@ extends Player -class_name BasePathPlayer +class_name PathPlayerBase var MAX_SPEED:float = 0.2 @@ -21,10 +21,8 @@ var has_next:bool = false var is_resetable:bool = false var buffered_curve:Curve3D var buffered_translate:Vector3 = Vector3(0,0,0) -var buffered_rotation_axis:Vector3 = Vector3(0,0,0) -var last_rotation_axis:Vector3 = Vector3(0,0,0) -var last_rotation_phi:float = 0 -var buffered_rotation_phi:float = 0 +var buffered_rotation:Vector3 = Vector3(0,0,0) +var last_rotation:Vector3 = Vector3(0,0,0) var torque_penalty:Vector3 var force_penalty:Vector3 @@ -48,26 +46,21 @@ func _physics_process(delta): has_next = false if path.curve.get_point_count() > 0: path.curve.clear_points() - + path.curve.set_bake_interval(0.05) for i in range(buffered_curve.get_point_count()): var _pos = buffered_curve.get_point_position(i) var _in = buffered_curve.get_point_in(i) var _out = buffered_curve.get_point_out(i) - if buffered_rotation_phi != 0: - _pos = _pos.rotated(buffered_rotation_axis, buffered_rotation_phi) - _in = _in.rotated(buffered_rotation_axis, buffered_rotation_phi) - _out = _out.rotated(buffered_rotation_axis, buffered_rotation_phi) - path.curve.add_point(_pos + buffered_translate, _in, _out) + if buffered_rotation.length() != 0: + _pos = _pos.rotated(buffered_rotation.normalized(), buffered_rotation.length()) + _in = _in.rotated(buffered_rotation.normalized(), buffered_rotation.length()) + _out = _out.rotated(buffered_rotation.normalized(), buffered_rotation.length()) + path.curve.add_point(buffered_translate + _pos, _in, _out) path.curve.set_point_tilt(i, buffered_curve.get_point_tilt(i)) - follow.set_offset(0.001) if get_road() != null: road_index = get_road().get_index() - - print(buffered_translate) - print(buffered_curve.get_point_count()) - print(path.curve.get_point_count()) if get_road() != null: var road = get_road() var penalty_index = road.penalty_index(follow.get_offset(), current_speed) @@ -102,18 +95,14 @@ func get_road(): func _on_raceCar_road_entered(road): buffered_curve = road.get_lane_curve(lane) - print(road.get_name()) - print(buffered_curve.get_baked_length()) - buffered_rotation_axis = last_rotation_axis - buffered_rotation_phi = last_rotation_phi + buffered_rotation = last_rotation if path.curve.get_point_count() > 0: buffered_translate = Util.Curve_get_last_point(path.curve) - if road.get_end_rotation_phi() != 0: - last_rotation_axis = (last_rotation_axis + road.get_end_rotation_axis()).normalized() - last_rotation_phi += road.get_end_rotation_phi() + if road.get_end_rotation().length() != 0: + last_rotation += road.get_end_rotation() has_next = true @@ -146,10 +135,12 @@ master func reset(): if road_before == null: road_before = road - #buffered_translate = road_before.get_curve().get_point_position(road_before.get_curve().get_point_count() - 1) - last_rotation_axis = road_before.get_rotation().normalized() - last_rotation_phi = road_before.get_rotation().length() - + last_rotation = road_before.get_rotation() + var point = Util.Curve_get_last_point(road_before.get_lane_curve(lane)) + if last_rotation.length() != 0: + point = point.rotated(last_rotation.normalized(), last_rotation.length()) + buffered_translate = road_before.get_translation() + point + follow.set_transform(road.get_transform()) race_car.road = null diff --git a/scripts/player/PathPlayerBot.gd b/scripts/player/PathPlayerBot.gd new file mode 100644 index 0000000..d866806 --- /dev/null +++ b/scripts/player/PathPlayerBot.gd @@ -0,0 +1,46 @@ +extends Spatial + +var player:PathPlayerBase + +var overspeed_rate:float = 0.8 +var underspeed_rate:float = 0.8 + +func _ready(): + randomize() + +func _physics_process(delta): + if is_network_master() && player != null: + if player.is_out: + if player.is_resetable: + player.reset() + else: + if player.get_road() != null: + var rate = randf() + var road = player.get_road() + var distance = player.follow.get_offset() + var speed = player.current_speed + var has_constrain = false + for index in range(road.speed_constrains.size()): + var constrain = road.speed_constrains[index] + if constrain.x <= distance && constrain.y >= distance: + has_constrain = true + if constrain.z > 0 && speed < constrain.z && rate > underspeed_rate: + player.current_speed += player.speed_factor + elif player.current_speed > 0 && rate > overspeed_rate: + player.current_speed -= player.speed_factor * player.brake_factor + if not has_constrain: + if player.current_speed <= player.MAX_SPEED && rate > underspeed_rate: + player.current_speed += player.speed_factor + elif player.current_speed > 0 && rate > overspeed_rate: + player.current_speed -= player.speed_factor * player.brake_factor + if player.current_speed < 0: + player.current_speed = 0 + +func set_player(path:String): + player = get_node(path) + +func set_overspeed_rate(new_overspeed_rate:float): + overspeed_rate = new_overspeed_rate + +func set_underspeed_rate(new_underspeed_rate:float): + underspeed_rate = new_underspeed_rate diff --git a/scripts/player/PathPlayerControls.gd b/scripts/player/PathPlayerControls.gd index 44a3ea9..bf73679 100644 --- a/scripts/player/PathPlayerControls.gd +++ b/scripts/player/PathPlayerControls.gd @@ -1,6 +1,6 @@ extends Spatial -var player:BasePathPlayer +var player:PathPlayerBase var camera:InterpolatedCamera func _physics_process(delta): @@ -15,7 +15,7 @@ func _physics_process(delta): camera.set_speed(10) player.reset() get_node("hud/reset").set_text("") - else: + else: if Input.is_action_pressed("ui_up") && player.current_speed <= player.MAX_SPEED: player.current_speed += player.speed_factor elif player.current_speed > 0: diff --git a/scripts/player/PathPlayerWheelRotation.gd b/scripts/player/PathPlayerWheelRotation.gd deleted file mode 100644 index 2039ad0..0000000 --- a/scripts/player/PathPlayerWheelRotation.gd +++ /dev/null @@ -1,19 +0,0 @@ -extends MeshInstance - -var old_rotation = 0 - -func _process(delta): - var parent_rotation = get_parent().get_parent().get_rotation_degrees().y - var rotation = (int(parent_rotation * 10) % 225 ) / 10 - - if parent_rotation < 0: - rotation *= -1 - - if rotation > old_rotation: - rotation += rotation - old_rotation - else: - rotation -= old_rotation - rotation - - old_rotation = rotation - - #set_rotation_degrees(Vector3(0,rotation,0)) diff --git a/scripts/road/road.gd b/scripts/road/road.gd index 945d9d0..e9a8725 100644 --- a/scripts/road/road.gd +++ b/scripts/road/road.gd @@ -2,8 +2,7 @@ extends MeshInstance class_name Road -export var end_rotation_axis:Vector3 = Vector3(0,0,0) -export var end_rotation_phi:float = 0.0 +export var end_rotation:Vector3 = Vector3(0,0,0) export var first_speed_factor:float = 1.0 export var creator_speed_factor:float = 1.0 @@ -50,11 +49,8 @@ func get_lane_curve(lane:int): else: return get_path().get_curve() -func get_end_rotation_axis(): - return end_rotation_axis - -func get_end_rotation_phi(): - return end_rotation_phi +func get_end_rotation(): + return end_rotation func set_preview(prev): preview = prev