76 lines
1.8 KiB
GDScript3
76 lines
1.8 KiB
GDScript3
|
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)
|