extends CanvasLayer ## 生命值归零后的死亡界面:画面渐黑 + 重新开始按钮。 ## 只负责显示和重启,死亡状态由玩家(is_dead)决定。 signal restart_requested @export var fade_time: float = 1.0 ## 渐黑完成后再过多久显示标题和按钮 @export var button_delay: float = 0.4 var _player: Node = null var _fade: ColorRect = null var _center: CenterContainer = null var _button: Button = null var _elapsed: float = 0.0 var _dying: 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/RestartButton") if _button != null: _button.pressed.connect(restart) if _fade != null: _fade.color = Color(0.0, 0.0, 0.0, 0.0) if _center != null: _center.visible = false func _process(delta: float) -> void: if not _dying: if _player == null or not is_instance_valid(_player): _player = get_tree().get_first_node_in_group("player") if _player == null: return if bool(_player.is_dead): _dying = true visible = true else: 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 _dying: 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: restart() func restart() -> void: restart_requested.emit() get_tree().paused = false get_tree().reload_current_scene()