70 lines
2.4 KiB
GDScript
70 lines
2.4 KiB
GDScript
class_name City extends Node3D
|
|
|
|
static var instance: City
|
|
|
|
@onready var block: PackedScene = preload("res://Scenes/Gameplay/block.tscn")
|
|
@onready var speedRing: PackedScene = preload("res://Scenes/Gameplay/ring.tscn")
|
|
@onready var neighborhood: Node3D = $Neighborhood
|
|
@onready var ringholder: Node3D = $Rings
|
|
|
|
@export var houses: Array[PackedScene]
|
|
@export var columns: int = 8
|
|
@export var rows: int = 15
|
|
@export var blockLength: float = 11
|
|
@export var blockScale: float = 10
|
|
|
|
var distance: float = 0
|
|
var rowIndex: int = 0
|
|
var cellSize: float
|
|
var rings: Array[SpeedRing]
|
|
var ringIndex: int = 0
|
|
|
|
func _enter_tree():
|
|
rings.resize(6)
|
|
if (instance == null || !is_instance_valid(instance)):
|
|
instance = self
|
|
else:
|
|
queue_free()
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
cellSize = blockLength * blockScale
|
|
for i in range(rings.size()):
|
|
rings[i] = speedRing.instantiate()
|
|
rings[i].scale = Vector3(5, 5, 5)
|
|
rings[i].strength = 1.5
|
|
ringholder.add_child(rings[i])
|
|
for y in range(rows):
|
|
for x in range(columns):
|
|
var road: Node3D = block.instantiate()
|
|
road.position = Vector3((x - (float(columns - 2) / 2)) * cellSize, 0, rowIndex * -cellSize)
|
|
neighborhood.add_child(road)
|
|
var house: Node3D = houses.pick_random().instantiate()
|
|
house.position = road.position + Vector3(-cellSize / 2, -0.2, -cellSize / 2)
|
|
house.rotate_y(randi_range(0, 3) * (PI / 2))
|
|
neighborhood.add_child(house)
|
|
rowIndex += 1
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(_delta: float) -> void:
|
|
if (distance >= cellSize):
|
|
distance -= cellSize
|
|
for i in range(columns * 2):
|
|
neighborhood.get_child(i).queue_free()
|
|
for i in range(columns):
|
|
var road: Node3D = block.instantiate()
|
|
road.position = Vector3((i - (float(columns - 2) / 2)) * cellSize, 0, rowIndex * -cellSize)
|
|
neighborhood.add_child(road)
|
|
var house: Node3D = houses.pick_random().instantiate()
|
|
house.position = road.position + Vector3(-cellSize / 2, -0.2, -cellSize / 2)
|
|
house.rotate_y(randi_range(0, 3) * (PI / 2))
|
|
neighborhood.add_child(house)
|
|
rings[ringIndex].position = Vector3(randf_range(-25, 25), randf_range(50, 85), (rowIndex * -cellSize) - randf_range(0, cellSize * 0.8))
|
|
ringIndex += 1
|
|
if (ringIndex >= rings.size()): ringIndex = 0
|
|
rowIndex += 1
|
|
|
|
func _on_back_pressed() -> void:
|
|
get_tree().root.add_child(load("res://Scenes/UI/MainMenu.tscn").instantiate())
|
|
queue_free()
|