extends Node2D signal game_success # inclusive, exclusive @export var id_range := Vector2i(1, 15) var available_labels: Array[RichTextLabel] = [] # 0:hide 1:display 2:cleared var id_state_arr: Array[int] = [] var display_timer := Timer.new() func _ready() -> void: for c in get_children(): if c is RichTextLabel: available_labels.append(c) c.modulate.a = 0.0 c.meta_clicked.connect(_on_meta_clicked.bind(c)) id_state_arr.resize(id_range.y - id_range.x) # 初始化文本 add_child(display_timer) display_timer.wait_time = 1.5 display_timer.timeout.connect(_display_next) # _reset_overtime_tween() func start_disperse_game() -> void: display_timer.start() # 分配一个 id 到 labels 上 func _display_next() -> void: if not available_labels: if GlobalConfig.DEBUG: print("no available labels") return var label = available_labels.pop_front() var next_id = -1 for i in range(len(id_state_arr)): if id_state_arr[i] == 0: next_id = i + id_range.x id_state_arr[i] = 1 break if GlobalConfig.DEBUG: print("next_id=", next_id) if next_id > 0: label.id = next_id var tween = create_tween() tween.tween_property(label, "modulate:a", 1.0, 1.0) func _on_meta_clicked(meta, label: RichTextLabel): var id = int(meta) if id_state_arr[id - id_range.x] != 1: return available_labels.append(label) id_state_arr[id - id_range.x] = 2 var tween = create_tween() tween.tween_property(label, "modulate:a", 0.0, 1.0) if id_state_arr.all(func(i): return i==2): game_success.emit() print("game success") # _reset_overtime_tween() # # 长时间不点击 # var overtime_tween: Tween # func _reset_overtime_tween() -> void: # if overtime_tween and overtime_tween.is_running(): # overtime_tween.kill() # overtime_tween = create_tween() # overtime_tween.tween_interval(2.0)