extends CanvasLayer @warning_ignore("unused_signal") signal exit(arg) @onready var sfx_picked = $SfxPicked as Sfx @onready var sfx_dropped = $SfxDropped as Sfx @onready var sfx_success = $SfxSuccess as Sfx @onready var draggables: Array[Draggable2D] = [ %"Draggable锁豆1", %"Draggable锁豆2", %"Draggable锁豆3", %"Draggable锁豆4" ] # draggables 在 dropped 时会 snap 到以下五个高度之一 var snapping_y_list := [139.0, 153.0, 167.0, 182.0, 197.0] # snapping_y_list: 1,2,3,4,5 # draggables: 2,4,3,5 var correct_answers := [153.0, 182.0, 167.0, 197.0] func _ready() -> void: layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME for d in draggables: d.picked.connect(func(_n): sfx_picked.play()) d.dropped.connect(_on_dropped) func _on_dropped(node: Draggable2D) -> void: var y = node.global_position.y # snap to snapping_heights var closest_y = snapping_y_list[0] var min_dist = abs(y - closest_y) for sy in snapping_y_list: var dist = abs(y - sy) if dist < min_dist: min_dist = dist closest_y = sy node.global_position.y = closest_y # 播放音效/检查是否成功 _post_dropped() func _post_dropped() -> void: # 锁豆 1-4 对应 correct_answers if ( draggables[0].global_position.y == correct_answers[0] and draggables[1].global_position.y == correct_answers[1] and draggables[2].global_position.y == correct_answers[2] and draggables[3].global_position.y == correct_answers[3] ): print("囚室开锁成功") sfx_success.play() _open_success() else: sfx_dropped.play() # 打开门锁,更新 event stage func _open_success() -> void: var parent = get_parent() as Closeup2D if parent: parent.hold_cancel_before_exit() # freeze all dragables for d in draggables: d.freezing = true await Util.wait(2.0) EventManager.set_stage_if_greater("c03_prison_lock", 1) exit.emit(true)