Files
Sprout-Farm/SproutFarm-Frontend/background.gd
2025-09-15 19:10:37 +08:00

104 lines
3.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
extends Sprite2D
#昼夜循环只需调节该节点的modulate值即可
# 存储背景图片的路径数组
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