extends CanvasLayer ## 过关界面:集齐钻石后碰到门显示。 ## 显示时把整棵树暂停,所以这一层的 process_mode 设成 ALWAYS(见 .tscn), ## 不然暂停后自己的动画和按钮也会停。 @export var fade_time: float = 0.8 @export var button_delay: float = 0.3 ## 点「进入下一关」时加载哪个场景。 ## 留空 = 重新加载本关;填 res://scenes/level_2.tscn 之类就跳到下一关。 @export_file("*.tscn") var next_level_scene: String = "" var _fade: ColorRect = null var _center: CenterContainer = null var _button: Button = null var _title: Label = null var _subtitle: Label = null var _elapsed: float = 0.0 var _showing: bool = false func _ready() -> void: visible = false _fade = get_node_or_null("Fade") _center = get_node_or_null("Center") _button = get_node_or_null("Center/VBox/NextButton") _title = get_node_or_null("Center/VBox/Title") _subtitle = get_node_or_null("Center/VBox/Subtitle") if _button != null: _button.pressed.connect(next_level) if _fade != null: _fade.color = Color(0.0, 0.0, 0.0, 0.0) if _center != null: _center.visible = false if next_level_scene.is_empty() and _button != null: _button.text = "重新开始 (R)" func show_clear() -> void: if _showing: return _showing = true visible = true _elapsed = 0.0 if _title != null: _title.text = "过关!" if _subtitle != null: var player := get_tree().get_first_node_in_group("player") var n: int = 0 if player == null else int(player.diamonds) _subtitle.text = "钻石 %d / %d" % [n, n] get_tree().paused = true func _process(delta: float) -> void: if not _showing: return _elapsed += delta if _fade != null: _fade.color = Color(0.0, 0.0, 0.0, clampf(_elapsed / maxf(fade_time, 0.01), 0.0, 1.0)) if _center != null and _elapsed >= fade_time + button_delay: _center.visible = true func _unhandled_input(event: InputEvent) -> void: if not _showing: return var key := event as InputEventKey if key != null and key.pressed and not key.echo: if key.physical_keycode == KEY_R or key.physical_keycode == KEY_ENTER: next_level() func next_level() -> void: get_tree().paused = false if next_level_scene.is_empty(): get_tree().reload_current_scene() else: get_tree().change_scene_to_file(next_level_scene)