3d-printing-simulator-textb.../Scenes/Map/map.gd

78 lines
2.4 KiB
GDScript

extends Node3D
@export var tile_scene: PackedScene
@export var tile_size: float = 2.0
@export var tile_separation: float = 0.2
var generated_tiles: Dictionary = {}
func _ready() -> void:
spawn_tile(Vector2i(0, 0))
func spawn_tile(grid_pos: Vector2i) -> void:
if generated_tiles.has(grid_pos):
return
var tile = tile_scene.instantiate()
add_child(tile)
var x_spacing = tile_size * 0.75 + tile_separation
var z_spacing = tile_size * sqrt(3) / 2 + tile_separation
var pos_x = grid_pos.x * x_spacing
var pos_z = grid_pos.y * z_spacing + (abs(grid_pos.x) % 2) * (z_spacing / 2.0)
var target_position = Vector3(pos_x, 0, pos_z)
tile.transform.origin = Vector3(pos_x, -3.0, pos_z)
generated_tiles[grid_pos] = tile
if tile.has_method("initialize"):
tile.initialize(grid_pos.x, grid_pos.y)
var tween = create_tween()
var tile_light = tile.get_node_or_null("OmniLight3D")
if tile_light:
tile_light.light_energy = 0.0
tween.tween_property(tile, "position", target_position, 0.8)\
.set_trans(Tween.TRANS_CUBIC)\
.set_ease(Tween.EASE_OUT)
if tile_light:
tween.parallel().tween_property(tile_light, "light_energy", 1.5, 0.8)\
.set_trans(Tween.TRANS_CUBIC)\
.set_ease(Tween.EASE_OUT)
func get_hex_neighbors(grid_pos: Vector2i) -> Array[Vector2i]:
var neighbors: Array[Vector2i] = []
neighbors.append(grid_pos + Vector2i(0, -1)) # Neighbor Up
neighbors.append(grid_pos + Vector2i(0, 1)) # Neighbor Down
neighbors.append(grid_pos + Vector2i(-1, 0)) # Neighbor Left
neighbors.append(grid_pos + Vector2i(1, 0)) # Neighbor Right
if abs(grid_pos.x) % 2 == 1:
neighbors.append(grid_pos + Vector2i(-1, 1)) # Neighbor Left-Down
neighbors.append(grid_pos + Vector2i(1, 1)) # Neighbor Right-Down
else:
neighbors.append(grid_pos + Vector2i(-1, -1)) # Neighbor Left-Up
neighbors.append(grid_pos + Vector2i(1, -1)) # Neighbor Right-Up
return neighbors
func _on_button_pressed() -> void:
var open_neighbors = []
for current_pos in generated_tiles.keys():
var neighbors = get_hex_neighbors(current_pos)
for n_pos in neighbors:
if not generated_tiles.has(n_pos) and not open_neighbors.has(n_pos):
open_neighbors.append(n_pos)
if open_neighbors.size() > 0:
var random_target_pos = open_neighbors[randi() % open_neighbors.size()]
spawn_tile(random_target_pos)
print("Generated new tile at: ", random_target_pos)
else:
print("World is full")