extends Control @onready var game_board_container = $VBoxContainer/HBoxContainer/VBoxContainer2/GameBoardContainer @onready var game_board = $VBoxContainer/HBoxContainer/VBoxContainer2/GameBoardContainer/GameBoard @onready var tiles_container = $VBoxContainer/HBoxContainer/VBoxContainer/TilesContainer @onready var audio_player = $AudioStreamPlayer @export var bg_color: Color = Color(1, 0, 0) @export var table_lines_color: Color = Color(1, 0, 0) @export var tiles_lines_color: Color = Color(1, 0, 0) @export var difficulty = -1 # 0: Fácil, 1: Medio, 2: Difícil var board_size = Vector2i(5, 5) var game_numbers = [] var number_tiles = [] var used_animals = [] func _ready(): RenderingServer.set_default_clear_color(bg_color) set_difficulty() audio_player.play() $VBoxContainer/MenuButton.get_popup().add_item("Reproducir sonido", 0) $VBoxContainer/MenuButton.get_popup().add_item("Salir", 1) $VBoxContainer/MenuButton.get_popup().connect("id_pressed", self._on_menu_item_selected) func set_difficulty(): match difficulty: 0: board_size = Vector2i(3, 3) 1: board_size = Vector2i(4, 4) 2: board_size = Vector2i(5, 5) setup_game() func _on_menu_item_selected(id): match id: 0: audio_player.play() 1: ScreenManager.go_back_to_previous_scene() func setup_game(): used_animals.clear() number_tiles.clear() game_board.get_node("GridContainer").columns = board_size.x var grid = game_board.get_node("GridContainer") for child in grid.get_children(): grid.remove_child(child) child.queue_free() for child in tiles_container.get_children(): tiles_container.remove_child(child) child.queue_free() game_numbers = generate_unique_numbers(board_size.x * board_size.y) game_numbers.shuffle() create_board_labels() create_number_tiles() var cell_size = get_responsive_cell_size() game_board_container.size = Vector2( cell_size.x * board_size.x, cell_size.y * board_size.y # Aquí calculamos la altura basándonos en las filas ) game_board.size = Vector2( cell_size.x * board_size.x, cell_size.y * board_size.y # Aquí calculamos la altura basándonos en las filas ) # Vamos a hacer que el GameBoard se expanda solo lo necesario game_board.size_flags_vertical = Control.SIZE_EXPAND_FILL func generate_unique_numbers(count: int) -> Array[int]: var numbers: Array[int] = [] for i in range(1, count + 1): numbers.append(i) return numbers func get_responsive_cell_size() -> Vector2: var base_width = 760.0 var base_height = 880.0 var total_x = board_size.x var total_y = board_size.y var w = base_width / total_x var h = base_height / total_y return Vector2(w, h).clamp(Vector2(64, 64), Vector2(256, 256)) func create_board_labels(): var animal_images = ImageLoader.get_all_animal_shadow_images() animal_images.shuffle() var board_slots_count = game_numbers.size() var fixed_cell_size = get_responsive_cell_size() for i in range(board_slots_count): var texture = animal_images[i % animal_images.size()] var sprite = Sprite2D.new() sprite.name = "Sprite2D" sprite.texture = texture sprite.scale = Vector2(fixed_cell_size.x / sprite.texture.get_width(), fixed_cell_size.y / sprite.texture.get_height()) sprite.position = fixed_cell_size / 2 var cell = Node2D.new() cell.position = Vector2(i % board_size.x * fixed_cell_size.x, int(i / board_size.x) * fixed_cell_size.y) var border = Line2D.new() border.add_point(Vector2(0, 0)) border.add_point(Vector2(fixed_cell_size.x, 0)) border.add_point(Vector2(fixed_cell_size.x, fixed_cell_size.y)) border.add_point(Vector2(0, fixed_cell_size.y)) border.add_point(Vector2(0, 0)) border.width = 4 border.default_color = table_lines_color cell.add_child(border) cell.add_child(sprite) var image_path = texture.resource_path var animal_name = image_path.get_file().replace("_sombra.png", "") used_animals.append(animal_name) cell.set("target_animal", animal_name) cell.set("is_target", true) cell.set("is_occupied", false) cell.name = animal_name game_board.get_node("GridContainer").add_child(cell) var static_body = StaticBody2D.new() cell.add_child(static_body) var collision_shape = CollisionShape2D.new() var rectangle_shape = RectangleShape2D.new() rectangle_shape.size = fixed_cell_size collision_shape.shape = rectangle_shape static_body.add_child(collision_shape) func create_number_tiles(): var shuffled_animals = used_animals.duplicate() shuffled_animals.shuffle() var fixed_cell_size = get_responsive_cell_size() for i in range(shuffled_animals.size()): var animal_name = shuffled_animals[i] var all_color_images = ImageLoader.get_all_animal_color_images() var texture = all_color_images.get(animal_name, null) if texture == null: continue var sprite = Sprite2D.new() sprite.texture = texture sprite.scale = Vector2(fixed_cell_size.x / texture.get_width(), fixed_cell_size.y / texture.get_height()) sprite.position = fixed_cell_size / 2 var tile = Node2D.new() tile.name = animal_name tile.position = Vector2(i % board_size.x * fixed_cell_size.x, int(i / board_size.x) * fixed_cell_size.y) tile.set("animal_name", animal_name) tile.set("is_dragging", false) tile.set("correct_slot", null) tile.set_script(preload("res://scripts/animal_tile.gd")) tile.add_child(sprite) var border = Line2D.new() border.add_point(Vector2(0, 0)) border.add_point(Vector2(fixed_cell_size.x, 0)) border.add_point(Vector2(fixed_cell_size.x, fixed_cell_size.y)) border.add_point(Vector2(0, fixed_cell_size.y)) border.add_point(Vector2(0, 0)) border.width = 4 border.default_color = tiles_lines_color tile.add_child(border) var area = Area2D.new() tile.add_child(area) var collision_shape = CollisionShape2D.new() var rectangle_shape = RectangleShape2D.new() rectangle_shape.size = fixed_cell_size collision_shape.shape = rectangle_shape area.add_child(collision_shape) tiles_container.add_child(tile) number_tiles.append(tile) func check_win(): var all_matched = true for child in game_board.get_node("GridContainer").get_children(): if child is AnimalTile and child.correct_slot == null: print("Porque") all_matched = false break if all_matched: GameData.end_game() var popup = $WinPopup popup.get_node("VBoxContainer/victory_label").text = "✅ ¡Has ganado!" popup.get_node("VBoxContainer/duration_label").text = "🕐 Tiempo total: %s segundos" % GameData.get_duration() popup.get_node("VBoxContainer/fail_count_label").text = "❌ Fallos totales: %s" % GameData.fail_count popup.show() $Blocker.visible = true func _on_exit_button_pressed(): ScreenManager.go_back_to_previous_scene()