210 lines
6.6 KiB
GDScript
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.
|