aboutsummaryrefslogtreecommitdiffstats
path: root/Scripts
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Scripts/Checkpoint.gd13
-rw-r--r--Scripts/UI_Control.gd20
-rw-r--r--Scripts/car_behaviour.gd48
-rw-r--r--Scripts/drawing.gd4
-rw-r--r--Scripts/game.gd13
-rw-r--r--Scripts/scene_control.gd22
6 files changed, 90 insertions, 30 deletions
diff --git a/Scripts/Checkpoint.gd b/Scripts/Checkpoint.gd
index d8c671e..119419a 100644
--- a/Scripts/Checkpoint.gd
+++ b/Scripts/Checkpoint.gd
@@ -3,17 +3,12 @@ extends Node2D
var was_visited = false
-@onready var sprite : Sprite2D = $Sprite2D
-
func set_was_visited(visited: bool):
was_visited = visited
- if(visited):
- hide()
- else:
- show()
- # TODO change the sprite to indicate the change
-
+ $Sprite2Dclosed.visible = visited
+ $Sprite2Dopen.visible = !visited
+
+
func _on_area_2d_body_entered(body):
- hide()
set_was_visited(true)
diff --git a/Scripts/UI_Control.gd b/Scripts/UI_Control.gd
index b7ce2a5..a45503a 100644
--- a/Scripts/UI_Control.gd
+++ b/Scripts/UI_Control.gd
@@ -5,6 +5,10 @@ extends Control
@onready var time_label = $InGameUI/CurrentTime
+@onready var gold_sprite: AnimatedSprite2D = $PostGameUI/Gold
+@onready var silver_sprite: AnimatedSprite2D = $PostGameUI/Silver
+@onready var bronze_sprite: AnimatedSprite2D = $PostGameUI/Bronze
+
func update_timer_label(new_time: float):
if(new_time < 0):
@@ -12,14 +16,28 @@ func update_timer_label(new_time: float):
return
time_label.text = str(new_time).pad_decimals(3)
-func switch_to_post_game_UI():
+func switch_to_post_game_UI(medal: int):
in_game_ui.visible = false
post_game_ui.visible = true
$PostGameUI/FinalTime.text = time_label.text
+
+ if medal == 0:
+ gold_sprite.visible = true
+ gold_sprite.play("default")
+ elif medal == 1:
+ silver_sprite.visible = true
+ silver_sprite.play("default")
+ elif medal == 2:
+ bronze_sprite.visible = true
+ bronze_sprite.play("default")
func switch_to_in_game_UI():
in_game_ui.visible = true
post_game_ui.visible = false
+
+ gold_sprite.visible = false
+ silver_sprite.visible = false
+ bronze_sprite.visible = false
func _on_start_button_pressed():
var root = owner.owner
diff --git a/Scripts/car_behaviour.gd b/Scripts/car_behaviour.gd
index 2ef9fb9..1a69b37 100644
--- a/Scripts/car_behaviour.gd
+++ b/Scripts/car_behaviour.gd
@@ -1,9 +1,10 @@
extends CharacterBody2D
# editor variables
-@export var max_speed = 300
-@export var steer_force = 0.1
-@export var acceleration = 0.0
+@export var max_speed = 800
+@export var steer_force = 20
+@export var acceleration = 8
+@export var mass = 1.0
@export var look_ahead = 75
@export var num_rays = 32
@export var driving = false
@@ -28,15 +29,19 @@ func _ready():
func _physics_process(delta):
if not driving:
+ $Sprite2D.hide()
return
+
+ $Sprite2D.show()
# Code for getting the next desired direction based on the environment
set_interest()
set_danger()
choose_direction()
- # example_movement(delta)
- own_movement(delta)
+# example_movement(delta)
+# own_movement(delta)
+ own_movement_improved(delta)
func set_interest():
@@ -91,13 +96,38 @@ func example_movement(delta):
rotation = velocity.angle()
move_and_collide(velocity * delta)
+
func own_movement(delta):
var desired_velocity = chosen_dir.rotated(rotation) * max_speed
+
+ var new_speed = lerpf(velocity.length(), max_speed, acceleration)
+ var new_angle = lerp_angle(velocity.angle(), desired_velocity.angle(), steer_force)
+
+ velocity = Vector2.from_angle(new_angle) * new_speed
+ rotation = new_angle
+ move_and_collide(velocity * delta)
+
+
+func own_movement_improved(delta):
+ var desired_velocity = chosen_dir.rotated(rotation) * max_speed
+ print('==========')
+ print('current speed: ', velocity.length(), ' | current angle: ', velocity.angle())
+ print('desired speed: ', desired_velocity.length(), ' | desired angle: ', desired_velocity.angle())
- var actual_speed = lerpf(velocity.length(), max_speed, acceleration)
- var actual_angle = lerp_angle(velocity.angle(), desired_velocity.angle(), steer_force)
+# var possible_radius = mass * velocity.length_squared() / steer_force
+# var possible_steer_angle = velocity.length() / possible_radius
+ var possible_steer_angle = steer_force / (mass * velocity.length())
+ var angle_change = clampf(wrapf(desired_velocity.angle() - velocity.angle(), -PI, PI), -possible_steer_angle, possible_steer_angle)
+ var new_angle = wrapf(velocity.angle() + angle_change, -PI, PI)
+ print('possible_steer_angle: ', possible_steer_angle, ' | angle_change: ', angle_change, ' | new_angle: ', new_angle )
- velocity = Vector2.from_angle(actual_angle) * actual_speed
- rotation = actual_angle
+ var wanted_speed = steer_force / (mass * absf(desired_velocity.angle() - velocity.angle()))
+ var new_max_speed = min(velocity.length() + (acceleration), max_speed)
+ var new_min_speed = max(velocity.length() - (acceleration), 0)
+ var new_speed = clampf(wanted_speed, new_min_speed, new_max_speed)
+ print('wanted: ', wanted_speed, ' | min: ', new_min_speed, ' | max: ', new_max_speed, ' | new: ', new_speed)
+ velocity = Vector2.from_angle(new_angle) * new_speed
+ rotation = new_angle
move_and_collide(velocity * delta)
+
diff --git a/Scripts/drawing.gd b/Scripts/drawing.gd
index a8068a2..6b94f6e 100644
--- a/Scripts/drawing.gd
+++ b/Scripts/drawing.gd
@@ -26,6 +26,10 @@ func _end_drawing():
func _input(event):
if drawing and event is InputEventMouseMotion:
line.add_point(event.position)
+ path.curve.add_point(event.position)
+ if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT:
+ drawing = false
+ reset()
func reset():
diff --git a/Scripts/game.gd b/Scripts/game.gd
index 72a01e3..c9beed2 100644
--- a/Scripts/game.gd
+++ b/Scripts/game.gd
@@ -1,17 +1,16 @@
extends Node2D
-const NUM_LEVELS = 2
-
# level control
var current_level_id = 0
var levels = []
var post_game = false
var scenes = [
-# preload("res://Nodes/levels/level1/level1.tscn"),
-# preload("res://Nodes/levels/level2/level2.tscn")
- preload("res://Nodes/Level_test.tscn"),
- preload("res://Nodes/Level_test_2.tscn")
+ preload("res://Levels/Tut01.tscn"),
+ preload("res://Levels/Tut02.tscn"),
+ preload("res://Levels/Tut03.tscn"),
+ preload("res://Levels/Level1.tscn"),
+ preload("res://Levels/Level2.tscn")
]
# Called when the node enters the scene tree for the first time.
@@ -53,7 +52,7 @@ func end_level():
func next_level():
current_level_id += 1
- if current_level_id >= NUM_LEVELS:
+ if current_level_id >= scenes.size():
get_tree().change_scene_to_file("res://Nodes/main_menu.tscn")
return
diff --git a/Scripts/scene_control.gd b/Scripts/scene_control.gd
index ce3332f..453853c 100644
--- a/Scripts/scene_control.gd
+++ b/Scripts/scene_control.gd
@@ -2,18 +2,22 @@ extends Node
class_name SceneControl
+@export var gold_medal_time = 5.0
+@export var silver_medal_time = 7.0
+@export var bronze_medal_time = 10
+
@onready var path: Path2D = $DrawNode/TrackPath
@onready var path_follow: PathFollow2D = $DrawNode/TrackPath/TrackFollower
@onready var car = $Car
@onready var checkpoints = $Checkpoints.get_children()
@onready var ui = $UI/Control
@onready var drawing = $DrawNode
+@onready var start = $Start
var is_driving = false
var current_time = 0.0
var game_control
-var start
func _ready():
@@ -23,8 +27,8 @@ func _ready():
$UI/Control/PostGameUI/RestartButton.pressed.connect(reset_level)
$UI/Control/PostGameUI/NextLevelButton.pressed.connect(next_level)
- start = $Start as TextureButton
- start.pressed.connect(start_drawing)
+ var start_button = $Start/Start as TextureButton
+ start_button.button_down.connect(start_drawing)
reset_level()
@@ -60,6 +64,7 @@ func reset_level():
car.global_position = start.global_position
car.global_rotation = start.rotation;
+ car.velocity = Vector2.ZERO
current_time = 0.0
@@ -75,10 +80,19 @@ func evaluate_driving():
return false
return true
+func evaluate_time():
+ if current_time < gold_medal_time:
+ return 0
+ if current_time < silver_medal_time:
+ return 1
+ if current_time < bronze_medal_time:
+ return 2
+ return 3
+
func _on_finish_line_body_entered(node: Node2D):
if evaluate_driving():
- ui.switch_to_post_game_UI()
+ ui.switch_to_post_game_UI(evaluate_time())
set_driving(false)
return