implemented level select, options menu, different audio buses & sliders
This commit is contained in:
parent
17085c5148
commit
f51914161e
14 changed files with 485 additions and 46 deletions
105
src/game/levels/level.gd
Normal file
105
src/game/levels/level.gd
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
extends Node2D
|
||||
#constants
|
||||
## initial width of the drawn track
|
||||
@export var starting_width := 50.0
|
||||
## amount of pixels that the width decreases every second
|
||||
@export var shrink_factor := .1
|
||||
## the diefference between the track's width and the maximum distance of the car from the center of the track. Should be about half the width of the car
|
||||
@export var max_distance_offset := .5
|
||||
## minimum distance traversed in a single frame to be counted as cheese
|
||||
@export var cheese_distance := 500
|
||||
## margin for error when checking for laps being driven
|
||||
@export var lap_count_margin := 50
|
||||
|
||||
#references
|
||||
## reference to the path describing the track
|
||||
@export var path: Path2D
|
||||
## reference to the line that draws the visual track
|
||||
@export var line: Line2D
|
||||
## reference to the player node
|
||||
@export var player: StaticBody2D
|
||||
## reference to the line node used to draw the finish line
|
||||
@export var finish: Line2D
|
||||
|
||||
signal distance_changed(new_distance)
|
||||
|
||||
#variables
|
||||
var width
|
||||
var running = true
|
||||
var last_offset = 0.
|
||||
var lap_distance = 0.
|
||||
var start
|
||||
var finish_right
|
||||
var finish_left
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
width = starting_width
|
||||
var start_out = path.curve.get_point_out(0)
|
||||
path.curve.set_point_in(path.curve.point_count - 1, path.curve.get_point_in(0))
|
||||
path.curve.set_point_out(path.curve.point_count - 1, start_out)
|
||||
line.set_width(width)
|
||||
line.set_points(path.curve.get_baked_points())
|
||||
start = path.curve.get_point_position(0)
|
||||
finish_right = start_out.normalized().rotated(deg_to_rad(90)) * width/2
|
||||
finish_left = start_out.normalized().rotated(deg_to_rad(-90)) * width/2
|
||||
finish.add_point(start + finish_right)
|
||||
finish.add_point(start + finish_left)
|
||||
# print_debug("start: ", start, "start out: ", start_out.normalized(), " finish left: ", start + start_out.normalized().rotated(90) * width/2, "start right: ", start + start_out.normalized().rotated(-90) * width/2)
|
||||
|
||||
player.position = start
|
||||
player.rotation = start_out.angle()
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _process(delta):
|
||||
if (running):
|
||||
# shrinking the track
|
||||
width -= shrink_factor * delta
|
||||
update_line()
|
||||
|
||||
|
||||
# checking whether the player is still on the track
|
||||
var p_pos = player.position
|
||||
var closest = path.curve.get_closest_point(p_pos)
|
||||
var p_dist = (p_pos - closest).length()
|
||||
# print_debug(" distance from track center: ", p_dist, " current track width: ", width)
|
||||
if p_dist > width/2 - max_distance_offset:
|
||||
game_over()
|
||||
|
||||
# counting the distance driven
|
||||
var offset = path.curve.get_closest_offset(p_pos)
|
||||
var off_diff = offset - last_offset
|
||||
if off_diff > 0:
|
||||
if off_diff > path.curve.get_baked_length() - lap_count_margin && off_diff < path.curve.get_baked_length() + lap_count_margin:
|
||||
print_debug("subtracting a lap")
|
||||
lap_distance -= path.curve.get_baked_length()
|
||||
else: if off_diff > cheese_distance:
|
||||
print_debug("cheese detected")
|
||||
game_over()
|
||||
last_offset = offset
|
||||
if off_diff < 0:
|
||||
if -off_diff < path.curve.get_baked_length() + lap_count_margin && -off_diff > path.curve.get_baked_length() - lap_count_margin:
|
||||
print_debug("adding a lap")
|
||||
lap_distance += path.curve.get_baked_length()
|
||||
last_offset = offset
|
||||
distance_changed.emit(get_total_distance())
|
||||
# print_debug("player distance driven: ", get_total_distance(), " distance since last check: ", off_diff)
|
||||
|
||||
|
||||
func update_line():
|
||||
line.set_width(width)
|
||||
finish.points[0] = start + finish_right.normalized() * width/2
|
||||
finish.points[1] = start + finish_left.normalized() * width/2
|
||||
|
||||
func get_total_distance():
|
||||
return lap_distance + last_offset
|
||||
|
||||
func game_over():
|
||||
running = false
|
||||
player.dead = true
|
||||
$player/death_sound.play()
|
||||
print_debug("final score: ", get_total_distance())
|
||||
await get_tree().create_timer(3).timeout
|
||||
|
||||
get_tree().reload_current_scene() #temp
|
||||
Loading…
Add table
Add a link
Reference in a new issue