From 5bf9ea473cfdb23a6a361984043618dcf53ee9cc Mon Sep 17 00:00:00 2001 From: reo Date: Tue, 11 Mar 2025 02:54:17 +0300 Subject: [PATCH] Add experimental road generation (generated by deepseek) --- scenes/game.tscn | 7 +++++- scenes/road.tscn | 17 ++++++++++++++ scenes/roadmanager.tscn | 6 +++++ scripts/player.gd | 3 +++ scripts/road.gd | 18 +++++++++++++++ scripts/road.gd.uid | 1 + scripts/road_manager.gd | 45 +++++++++++++++++++++++++++++++++++++ scripts/road_manager.gd.uid | 1 + 8 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 scenes/road.tscn create mode 100644 scenes/roadmanager.tscn create mode 100644 scripts/road.gd create mode 100644 scripts/road.gd.uid create mode 100644 scripts/road_manager.gd create mode 100644 scripts/road_manager.gd.uid diff --git a/scenes/game.tscn b/scenes/game.tscn index 4da3179..780fb90 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=8 format=3 uid="uid://d4ljkc7l57udr"] +[gd_scene load_steps=9 format=3 uid="uid://d4ljkc7l57udr"] +[ext_resource type="PackedScene" uid="uid://r1q4xvfbrc7l" path="res://scenes/roadmanager.tscn" id="1_lbhrr"] [ext_resource type="PackedScene" uid="uid://dtncvl5af4fhr" path="res://objects/road.glb" id="1_uwrxv"] [ext_resource type="Script" uid="uid://cs0y5pe8qnj2r" path="res://scripts/player.gd" id="2_lnu2h"] [ext_resource type="PackedScene" uid="uid://cewenjpq8wbig" path="res://objects/testcar.glb" id="2_yqjtg"] @@ -23,6 +24,10 @@ size = Vector3(3.60051, 2.21851, 1.87103) [node name="Game" type="Node3D"] +[node name="Node3D" parent="." instance=ExtResource("1_lbhrr")] + +[node name="RoadManager" parent="." instance=ExtResource("1_lbhrr")] + [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_iywne") diff --git a/scenes/road.tscn b/scenes/road.tscn new file mode 100644 index 0000000..6d0d25f --- /dev/null +++ b/scenes/road.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=3 uid="uid://bl4v7fq6p7evj"] + +[ext_resource type="PackedScene" uid="uid://dtncvl5af4fhr" path="res://objects/road.glb" id="1_mv8x7"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_1s9f8"] +size = Vector3(20, 10, 20) + +[node name="Road" type="Node3D"] + +[node name="RoadObject" parent="." instance=ExtResource("1_mv8x7")] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0) + +[node name="DespawnArea" type="Area3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -10) + +[node name="CollisionShape3D" type="CollisionShape3D" parent="DespawnArea"] +shape = SubResource("BoxShape3D_1s9f8") diff --git a/scenes/roadmanager.tscn b/scenes/roadmanager.tscn new file mode 100644 index 0000000..6a9b1e1 --- /dev/null +++ b/scenes/roadmanager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://r1q4xvfbrc7l"] + +[ext_resource type="Script" uid="uid://bkbm887f6xqpi" path="res://scripts/road_manager.gd" id="1_r1qkb"] + +[node name="RoadManager" type="Node3D"] +script = ExtResource("1_r1qkb") diff --git a/scripts/player.gd b/scripts/player.gd index d370b1b..a59a908 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -8,6 +8,9 @@ extends CharacterBody3D var current_speed: float = 0.0 +func _ready(): + add_to_group("player") + func _physics_process(delta: float) -> void: # Apply gravity if not is_on_floor(): diff --git a/scripts/road.gd b/scripts/road.gd new file mode 100644 index 0000000..f752090 --- /dev/null +++ b/scripts/road.gd @@ -0,0 +1,18 @@ +extends Node3D + +@export var despawn_distance := 50.0 # Distance behind player to despawn +var player: Node3D + +func _ready(): + # Find the player once when road spawns + player = get_tree().get_first_node_in_group("player") + + # Set up despawn area + var area = $DespawnArea + area.body_exited.connect(_on_body_exited) + area.position.z -= 10 # Adjust for scaled position + +func _on_body_exited(body: Node): + if body == player: + if global_position.x < player.global_position.x - despawn_distance: + queue_free() \ No newline at end of file diff --git a/scripts/road.gd.uid b/scripts/road.gd.uid new file mode 100644 index 0000000..752aeb5 --- /dev/null +++ b/scripts/road.gd.uid @@ -0,0 +1 @@ +uid://b0pm2dfsugptw diff --git a/scripts/road_manager.gd b/scripts/road_manager.gd new file mode 100644 index 0000000..f044f2e --- /dev/null +++ b/scripts/road_manager.gd @@ -0,0 +1,45 @@ +extends Node3D + +@export var road_scene: PackedScene = preload("res://scenes/road.tscn") +@export var initial_roads := 5 # Number of roads to spawn on each side +@export var road_spacing := 20.0 # Exact spacing from original scene +@export var spawn_distance := 50.0 # Distance ahead to spawn new roads + +var player: Node3D +var last_spawn_x := 0.0 + +func _ready(): + # Use call_deferred to ensure player exists + call_deferred("initialize_player") + +func initialize_player(): + player = get_tree().get_first_node_in_group("player") + if not player: + push_error("Player not found in 'player' group!") + return + + # Initialize starting roads relative to player position + var start_x = floor(player.global_position.x / 20.0) * 20.0 + for i in range(-initial_roads, initial_roads): + spawn_road(start_x + i * 20.0) + last_spawn_x = start_x + initial_roads * 20.0 + +func _process(_delta): + if not player: + return # Skip if player not found + + # Check road spawning based on player's X position + if player.global_position.x > last_spawn_x - spawn_distance: + spawn_road(last_spawn_x + 20.0) + last_spawn_x += 20.0 + +func spawn_road(x_position: float): + var new_road = road_scene.instantiate() + # Add proper positioning based on original road spacing + new_road.global_transform = Transform3D( + Vector3(2, 0, 0), + Vector3(0, 2, 0), + Vector3(0, 0, 2), + Vector3(x_position, 0, 0) + ) + add_child(new_road) diff --git a/scripts/road_manager.gd.uid b/scripts/road_manager.gd.uid new file mode 100644 index 0000000..af7ecd7 --- /dev/null +++ b/scripts/road_manager.gd.uid @@ -0,0 +1 @@ +uid://bkbm887f6xqpi