127 lines
4.1 KiB
GDScript
127 lines
4.1 KiB
GDScript
extends Node2D
|
|
|
|
@onready var game_board_container = $GameBoardContainer
|
|
@onready var number_holder = $Holder
|
|
@onready var game_board = $GameBoardContainer/GameBoard
|
|
|
|
var difficulty = 1 # 1: Fácil, 2: Medio, 3: Difícil
|
|
var board_size = Vector2i(5, 5)
|
|
var game_numbers = []
|
|
var number_tiles = []
|
|
var correct_matches = {}
|
|
|
|
func _ready():
|
|
setup_game()
|
|
|
|
func setup_game():
|
|
game_board.get_node("GridContainer").columns = board_size.x
|
|
|
|
game_numbers = generate_unique_numbers(board_size.x * board_size.y)
|
|
game_numbers.shuffle()
|
|
|
|
create_board_labels()
|
|
create_number_tiles()
|
|
|
|
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 create_board_labels():
|
|
var animal_images = get_all_animal_shadow_images()
|
|
animal_images.shuffle()
|
|
|
|
var board_slots_count = game_numbers.size()
|
|
var fixed_cell_size = Vector2(152, 176) # Establece un tamaño fijo de 152x176 para cada celda
|
|
for i in range(board_slots_count):
|
|
var image_path = animal_images[i % animal_images.size()]
|
|
var texture = load(image_path)
|
|
var sprite = Sprite2D.new()
|
|
sprite.texture = texture
|
|
sprite.scale = Vector2(fixed_cell_size.x / sprite.texture.get_width(), fixed_cell_size.y / sprite.texture.get_height())
|
|
sprite.position = Vector2(fixed_cell_size.x / 2, fixed_cell_size.y / 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 = Color(1, 0, 0)
|
|
cell.add_child(border)
|
|
|
|
cell.add_child(sprite)
|
|
var animal_name = image_path.get_file().replace("_sombra.png", "")
|
|
cell.set("target_animal", animal_name)
|
|
cell.set("is_target", true)
|
|
cell.set("is_occupied", false)
|
|
cell.name = "BoardCell_" + str(i)
|
|
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)
|
|
|
|
correct_matches[str(i)] = animal_name
|
|
|
|
|
|
func get_all_animal_shadow_images() -> Array[String]:
|
|
var dir = DirAccess.open("res://images")
|
|
var images: Array[String] = []
|
|
if dir:
|
|
dir.list_dir_begin()
|
|
var file_name = dir.get_next()
|
|
while file_name != "":
|
|
if file_name.ends_with("_sombra.png"):
|
|
images.append("res://images/" + file_name)
|
|
file_name = dir.get_next()
|
|
dir.list_dir_end()
|
|
else:
|
|
print("¡No se pudo abrir el directorio de imágenes!")
|
|
return images
|
|
|
|
func create_number_tiles():
|
|
var shuffled_numbers = game_numbers.duplicate()
|
|
shuffled_numbers.shuffle()
|
|
var tiles_container = $TilesContainer
|
|
|
|
for i in range(shuffled_numbers.size()):
|
|
var tile = Label.new()
|
|
tile.text = str(shuffled_numbers[i])
|
|
tile.name = "NumberTile_" + str(shuffled_numbers[i])
|
|
tile.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
tile.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
|
|
tile.custom_minimum_size = Vector2(152, 176)
|
|
tile.add_theme_font_size_override("font_size", 40)
|
|
tile.add_theme_stylebox_override("normal", StyleBoxFlat.new())
|
|
tile.get_theme_stylebox("normal").bg_color = Color(0.8, 0.8, 1.0)
|
|
tile.script = preload("res://number_tile.gd")
|
|
tiles_container.add_child(tile)
|
|
number_tiles.append(tile)
|
|
|
|
var area = Area2D.new()
|
|
tile.add_child(area)
|
|
|
|
var collision_shape = CollisionShape2D.new()
|
|
var rectangle_shape = RectangleShape2D.new()
|
|
rectangle_shape.size = tile.get_rect().size
|
|
collision_shape.shape = rectangle_shape
|
|
area.add_child(collision_shape)
|
|
|
|
func check_win():
|
|
var all_matched = true
|
|
for child in game_board.get_children():
|
|
if child is NumberTile and child.correct_slot == null:
|
|
all_matched = false
|
|
break
|
|
if all_matched:
|
|
print("¡Has ganado!")
|