xiandie/scene/ground/script/c03/s09_closeup九宫格游戏.gd

84 lines
2.2 KiB
GDScript3
Raw Normal View History

2025-08-18 08:23:01 +00:00
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
2025-08-18 08:23:01 +00:00
func _ready() -> void:
2025-08-20 09:18:26 +00:00
# TODO 1、保存操作状态 2、成功后锁定操作
2025-08-18 08:23:01 +00:00
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