using Godot; using System; using System.Collections.Generic; /// /// 场景加载器 /// public partial class Loader : Control { private ProgressBar _progressBar; private int _sceneLoaded; private List _resToLoad = new (){ "res://scenes/lab.tscn", "res://scenes/player.tscn" }; // Called when the node enters the scene tree for the first time. /// /// 场景加载完成时调用 /// public override void _Ready() { _progressBar = GetNode("ProgressBar"); string 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) { Godot.Collections.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; } } }