63 lines
2.2 KiB
C#
63 lines
2.2 KiB
C#
using System.Collections.Generic;
|
|
using Godot;
|
|
using Godot.Collections;
|
|
|
|
/// <summary>
|
|
/// 场景加载器
|
|
/// </summary>
|
|
public partial class Loader : Control {
|
|
private readonly List<string> _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.
|
|
/// <summary>
|
|
/// 场景加载完成时调用
|
|
/// </summary>
|
|
public override void _Ready() {
|
|
_progressBar = GetNode<ProgressBar>("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.
|
|
/// <summary>
|
|
/// 每帧更新
|
|
/// </summary>
|
|
/// <param name="delta">帧间隔</param>
|
|
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;
|
|
}
|
|
}
|
|
} |