AppResidencia/empareja-las-sombras/scripts/node_2d.gd

210 lines
6.6 KiB
GDScript

extends Node2D
@onready var game_board_container = $HBoxContainer/VBoxContainer2/GameBoardContainer
@onready var game_board = $HBoxContainer/VBoxContainer2/GameBoardContainer/GameBoard
@onready var tiles_container = $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 # 1: Fácil, 2: Medio, 3: 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() # Cambiá a 2 o 3 para probar otros niveles
audio_player.play()
$MenuButton.get_popup().add_item("Reproducir sonido", 0)
$MenuButton.get_popup().add_item("Salir", 1)
$MenuButton.get_popup().connect("id_pressed", self._on_menu_item_selected)
func set_difficulty():
match difficulty:
1:
board_size = Vector2i(3, 3)
2:
board_size = Vector2i(4, 4)
3:
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()
GameData.send_game_data()
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.popup_centered()
func _on_exit_button_pressed() -> void:
ScreenManager.go_back_to_previous_scene()
func _on_exit_endgame_button_pressed() -> void:
pass # Replace with function body.