class_name HoverLightClickArea extends Area2D signal clicked @export var freezing := false: set(val): freezing = val if freezing and touching: _on_mouse_exited() var touching = false static var current_focusing_item = "": set(val): current_focusing_item = val if GlobalConfig.DEBUG: print("HoverLightClickArea current_focusing_item=", current_focusing_item) static var pending_enter_callables := [] as Array[Callable] # to pointlight2d var lights: Array[NodePath] = [] func _ready() -> void: for c in get_children(): if c is PointLight2D: lights.append(c) if lights.is_empty(): printerr("HoverLightButton has no PointLight2D children") mouse_entered.connect(_on_mouse_entered) mouse_exited.connect(_on_mouse_exited) func is_focused() -> bool: return current_focusing_item == name func _on_mouse_entered() -> bool: touching = true if freezing or not is_visible_in_tree(): return false if is_focused(): return true # 尝试获得 current_focusing_item if current_focusing_item != "": if not pending_enter_callables.has(_on_mouse_entered): pending_enter_callables.append(_on_mouse_entered) return false current_focusing_item = name _toggle_light(true) return true func _on_mouse_exited() -> void: touching = false pending_enter_callables.erase(_on_mouse_entered) # frezzing 不影响 mouse exited if is_focused(): current_focusing_item = "" for c in pending_enter_callables: if c.call(): break _toggle_light(false) func _toggle_light(on: bool) -> void: for l in lights: var light = get_node(l) as PointLight2D if light: light.enabled = on