using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Godot; using Godot.Collections; namespace Cirno.Scripts.UI; public partial class IntroScenePlayer : CanvasLayer { [Export] public Control PanelsHolder { get; private set; } [Export] public Array Images { get; private set; } [Export] public float TransitionTime = 5f; [Export] public string NextSceneName { get; set; } private int _currentPanelIndex; private List _panels = new (); public TextureRect CurrentPanel => _panels[_currentPanelIndex]; private double _timer = 0f; private bool _running = false; public override void _Ready() { _timer = 0; _running = true; foreach (var image in Images) { var panel = new TextureRect(); panel.Texture = image; panel.ExpandMode = TextureRect.ExpandModeEnum.KeepSize; panel.StretchMode = TextureRect.StretchModeEnum.KeepAspectCentered; panel.Visible = false; panel.SetModulate(new Color(panel.Modulate.R, panel.Modulate.G, panel.Modulate.B, 0f)); PanelsHolder.CallDeferred("add_child", panel); _panels.Add(panel); } var first = _panels.First(); first.Visible = true; first.SetModulate(new Color(first.Modulate.R, first.Modulate.G, first.Modulate.B, 1f)); } public override void _Process(double delta) { if (!_running) return; _timer += delta; if (_timer >= TransitionTime) { _timer = 0; _currentPanelIndex++; if (_currentPanelIndex >= _panels.Count) { _running = false; Finished(); return; } _running = false; _ = Transition(); } } private void Finished() { GlobalState.Instance.GotoScene(NextSceneName); //GetTree().ChangeSceneToFile(NextSceneName); } private async Task Transition() { TextureRect previousPanel = _panels[_currentPanelIndex-1]; CurrentPanel.Visible = true; var tween = GetTree().CreateTween(); tween.SetEase(Tween.EaseType.InOut); tween.SetTrans(Tween.TransitionType.Linear); tween.TweenProperty(previousPanel, "modulate:a", 0f, 1f); tween.TweenProperty(CurrentPanel, "modulate:a", 1f, 1f); await ToSignal(tween, "finished"); previousPanel.Visible = false; _running = true; } }