small racing game im working on
Diffstat (limited to 'scenes/track-base.gd')
| -rw-r--r-- | scenes/track-base.gd | 131 |
1 files changed, 20 insertions, 111 deletions
diff --git a/scenes/track-base.gd b/scenes/track-base.gd index 7ea90f0..0aec1f1 100644 --- a/scenes/track-base.gd +++ b/scenes/track-base.gd @@ -1,122 +1,31 @@ -@tool -extends Path3D +extends Node3D class_name TrackLoader -@export_group("Track") -@export var track: TrackResource = null: - set(new_track): - if track != new_track: - track = new_track - is_dirty = true - call_deferred("_update") -@export var force_update: bool = false: - set(update): - if update == true && update != force_update: - force_update = false - is_dirty = true - call_deferred("_update") - -@onready var road := $Road as CSGPolygon3D -@onready var rail_l := $WallL as CSGPolygon3D -@onready var rail_r := $WallR as CSGPolygon3D -@onready var collision := $CollisionShape as CSGPolygon3D +@export var track: TrackResource = null @onready var sun := $Sun as DirectionalLight3D @onready var ground := $Ground as StaticBody3D var checkpoints: Array[CheckPoint] var finish: Finish -var start_rot: Vector3 -var start_pos: Vector3 -var is_dirty := true - -func vec(x := 0.0, y := 0.0) -> Vector2: - return Vector2(x, y) - -func _update(): - if !is_dirty or !track or !track.track: - # curve = null # editor freezes with this, idk why - return - curve = track.track - curve.set_point_tilt(0, PI/2) - curve.set_point_tilt(curve.get_point_count() - 1, 0.0) - - sun.rotation_degrees.x = (track.sun_x) - sun.rotation_degrees.y = (track.sun_y) - - - # update our track - var thw := track.track_width * 0.5 # track half width - road.polygon = PackedVector2Array([vec(-thw), vec(-thw), vec(thw), vec(thw)]) - - # update our rails - var outer := thw + track.barrier_width - rail_l.polygon = PackedVector2Array([ - vec(outer, 2), - vec(thw, 2), # widen - vec(thw), # widen - vec(outer) - ]) - rail_l.visible = track.left_barrier - rail_r.polygon = PackedVector2Array([ - vec(-outer, 2), - vec(-thw, 2), # widen - vec(-thw), # widen - vec(-outer) - ]) - rail_r.visible = track.right_barrier +var start_transf: Transform3D +var editor := false - # update our collision - collision.polygon = PackedVector2Array([ - vec(-thw), # widen - vec(thw), # widen - vec(thw, 5.0), # widen - vec(outer, 5.0), - vec(outer, -1.0), - vec(-outer, -1.0), - vec(-outer, 5.0), - vec(-thw, 5.0), # widen - ]) - # objects - for child in get_children(): - if child is PathFollow3D: - child.queue_free() - - for i in len(track.checkpoints): - var c: CheckPoint = make_follower(track.checkpoint_scene, track.checkpoints[i], track.checkpoint_scale, track.checkpoint_needs_collision) - if not Engine.is_editor_hint(): # godot tools are wierd - checkpoints.append(c) - - finish = make_follower(track.finish_scene, track.finish_location, track.finish_scale, track.finish_needs_collision) - if track.laps == 1: - var s: Start = make_follower(track.start_scene, track.start_location, track.start_scale, track.start_needs_collision) - start_pos = s.global_position - start_rot = s.global_rotation - else: - start_pos = finish.global_position - start_rot = finish.global_rotation - - # loopage - rail_l.path_joined = track.is_loop - rail_r.path_joined = track.is_loop - collision.path_joined = track.is_loop - road.path_joined = track.is_loop - - # offset +func update(): + sun.rotation_degrees.x = track.sun_x + sun.rotation_degrees.y = track.sun_y ground.global_position = track.offset - - is_dirty = false + for block in track.blocks: + var node: Block = block.create(editor) + if editor: + block.set_live(node) + add_child(node) + if not editor: + if node is CheckPoint: + checkpoints.append(node) + elif node is Finish: + finish = node + elif node is Start: + start_transf = block.transform func _ready(): - _update() - -func _on_curve_changed() -> void: - is_dirty = true - call_deferred("_update") - -func make_follower(scene: PackedScene, ratio: float, scl: Vector3, collide: bool) -> PathFollow3D: - var follower: PathFollow3D = scene.instantiate() - follower.needs_collision = collide - add_child(follower) - follower.scale = scl - follower.progress_ratio = ratio # ratio set must be after add_child() - return follower + update() |