xiandie/scene/ground/script/c04/除晦游戏文字root.gd

76 lines
1.8 KiB
GDScript3
Raw Normal View History

2025-09-17 14:41:06 +00:00
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)