extends CanvasLayer @warning_ignore("unused_signal") signal exit(arg) @onready var grid = %GridContainer as GridContainer @onready var block_arr: Array[TextureButton] = [%B0, %B1, %B2, %B3, %B4, %B5, %B6, %B7, %B8] # 留出一个空缺 var empty_id := 4 func _ready() -> void: # TODO 1、保存操作状态 2、成功后锁定操作 layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME block_arr[empty_id].modulate.a = 0.0 for id in range(block_arr.size()): var btn := block_arr[id] btn.pressed.connect(_on_button_pressed.bind(btn)) if id != empty_id: btn.mouse_entered.connect(_toggle_hightlight.bind(btn, true)) btn.mouse_exited.connect(_toggle_hightlight.bind(btn, false)) # suffle suffling = true for i in 200: _on_button_pressed(block_arr.pick_random()) suffling = false var suffling = false var game_success = false func _on_button_pressed(btn: TextureButton) -> void: if game_success: return var current_blocks = grid.get_children() var empty_coord = current_blocks.find(block_arr[empty_id]) var empty_x = empty_coord % 3 @warning_ignore("integer_division") var empty_y = floori(empty_coord / 3) var block_coord = current_blocks.find(btn) var block_x = block_coord % 3 @warning_ignore("integer_division") var block_y = floori(block_coord / 3) # 判断能否交换 if abs(empty_x - block_x) + abs(empty_y - block_y) == 1: # 交换位置,先移动后面的到前面 if empty_coord < block_coord: grid.move_child(btn, empty_coord) grid.move_child(block_arr[empty_id], block_coord) else: grid.move_child(block_arr[empty_id], block_coord) grid.move_child(btn, empty_coord) _check_success() elif not suffling: $SfxInvalid.play() func _check_success() -> void: if suffling: return # 判断游戏是否成功 var success := true var current_blocks = grid.get_children() for i in 9: if current_blocks[i] != block_arr[i]: success = false if success: # 游戏成功 $SfxValid.play() print("success") game_success = true var block = block_arr[empty_id] var tween = create_tween() tween.tween_property(block, "modulate:a", 1.0, 1.0) func _toggle_hightlight(btn: TextureButton, highlight: bool) -> void: if game_success: highlight = false btn.get_node("PointLight2D").enabled = highlight