using System.Collections.Generic; using Godot; using Godot.Collections; /// /// 场景加载器 /// public partial class Loader : Control { private readonly List _resToLoad = new() { "res://scenes/lab.tscn", "res://scenes/player.tscn" }; private ProgressBar _progressBar; private int _sceneLoaded; // Called when the node enters the scene tree for the first time. /// /// 场景加载完成时调用 /// public override void _Ready() { _progressBar = GetNode("ProgressBar"); var nextScene = GameManager.NextScene; if (nextScene != null) GameManager.NextScene = "res://scenes/lab.tscn"; // resToLoad.AddRange(Res.Accessory); // resToLoad.AddRange(Res.Body); // resToLoad.AddRange(Res.Eye); // resToLoad.AddRange(Res.Hair); // resToLoad.AddRange(Res.Outfit); // resToLoad.AddRange(Res.Smartphone); ResourceLoader.LoadThreadedRequest(_resToLoad[_sceneLoaded]); _progressBar.MaxValue = 100 * _resToLoad.Count; SetProcess(true); } // Called every frame. 'delta' is the elapsed time since the previous frame. /// /// 每帧更新 /// /// 帧间隔 public override void _Process(double delta) { Array progress = new(); switch (ResourceLoader.LoadThreadedGetStatus(_resToLoad[_sceneLoaded], progress)) { case ResourceLoader.ThreadLoadStatus.InProgress: _progressBar.Value = 100 * _sceneLoaded + (int)((float)progress[0] * 100); break; case ResourceLoader.ThreadLoadStatus.Loaded: _sceneLoaded++; if (_sceneLoaded < _resToLoad.Count) { ResourceLoader.LoadThreadedRequest(_resToLoad[_sceneLoaded]); } else { SetProcess(false); GetTree().ChangeSceneToFile("res://scenes/lab.tscn"); } break; default: GD.Print("Error loading scene: " + _resToLoad[_sceneLoaded]); break; } } }