extends Sprite2D # 存储背景图片的路径数组 var backgrounds :Array = [ "res://assets/背景图片/背景1.webp", "res://assets/背景图片/背景2.webp", "res://assets/背景图片/背景3.webp", "res://assets/背景图片/背景4.webp", "res://assets/背景图片/背景5.webp", "res://assets/背景图片/背景6.webp", "res://assets/背景图片/背景7.webp", "res://assets/背景图片/背景8.webp", "res://assets/背景图片/背景9.webp", "res://assets/背景图片/背景10.webp" ] # 当前显示的背景索引 var current_index = -1 # 过渡动画的持续时间(秒) @export var transition_duration: float = 1.5 # 节点引用 @onready var background2: Sprite2D = $Background2 @onready var timer: Timer = $Timer # 用于持有当前正在运行的Tween的引用,方便在需要时中止它 var current_tween: Tween func _ready(): # 验证背景图片资源 if not validate_backgrounds(): return # 初始化,直接设置第一张背景,不进行过渡 current_index = randi() % backgrounds.size() self.texture = load(backgrounds[current_index]) # 设置第二个Sprite的初始状态为完全透明 background2.modulate.a = 0.0 # 配置计时器 timer.wait_time = 10.0 timer.timeout.connect(switch_background) # 直接连接切换函数 timer.start() func validate_backgrounds() -> bool: var valid_backgrounds = [] for bg_path in backgrounds: if ResourceLoader.exists(bg_path): valid_backgrounds.append(bg_path) else: push_error("背景图片不存在: " + bg_path) backgrounds = valid_backgrounds if backgrounds.is_empty(): push_error("没有可用的背景图片!") return false return true func switch_background(): if backgrounds.size() <= 1: return # 1. 选择一张新的、不重复的背景图 var new_index = randi() % backgrounds.size() while new_index == current_index: new_index = randi() % backgrounds.size() current_index = new_index var new_texture = load(backgrounds[current_index]) if new_texture == null: push_error("无法加载背景图片: " + backgrounds[current_index]) return # 2. 将新图片设置到上层的Sprite2D (background2) background2.texture = new_texture # 3. 【核心改动】创建并执行Tween动画 # 如果上一个动画还在运行,先中止它,防止动画重叠或冲突 if current_tween and current_tween.is_valid(): current_tween.kill() # 直接从节点创建 Tween 对象,无需场景树中有Tween节点 current_tween = create_tween() # 设置动画:让 background2 的 modulate.a (透明度) 从 0 (透明) 渐变到 1 (不透明) current_tween.tween_property(background2, "modulate:a", 1.0, transition_duration)\ .set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_SINE) # 4. 动画完成后,通过 .connect() 连接一个回调函数进行状态重置 current_tween.finished.connect(_on_transition_finished) # 注意:之前的 _on_timer_timeout 函数的功能已合并到 switch_background # 所以我们只需要一个动画完成后的回调函数 func _on_transition_finished(): # 动画结束后,将新背景 "固化" 到主背景上 self.texture = background2.texture # 并将上层背景重置为透明,为下一次过渡做准备 background2.modulate.a = 0.0 # 清除引用,虽然不必须,但是个好习惯 current_tween = null