2024-11-26-GodotSaveDemo

2024-11-26-GodotSaveDemo

十一月 26, 2024

动态存档Demo示例

没什么用留档纪念自己的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using Godot;
using System.Collections.Generic;
using System.Linq;



public partial class Archives : Node2D
{
private List<string> SaveFiles;
private int SaveFileIndex = 25;
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
// 创建一个 GridContainer ScrollContainer
// 创建 ScrollContainer 实例

var HFContainer = new HFlowContainer
{
Name = "HFlowContainer"
};
HFContainer.Size = new Vector2(1600, 800);
HFContainer.SetPosition(new Vector2(130, 180));
// 设置外间距
// gridContainer
AddChild(HFContainer);

// 创建按钮
SaveFiles = GetSaveFiles().Take(SaveFileIndex).ToList();
// 要根据当前状态选择按钮数量哦

// 初始25
for (int i = 0; i < 25; i++)
{
string ButtonName = "空存档";
if (i < SaveFiles.Count()){
ButtonName = SaveFiles[i];
}
var button = new Button
{
Text = ButtonName
};
button.SetCustomMinimumSize(new Vector2(300, 170));
HFContainer.AddChild(button); // 添加按钮到 GridContainer
}

}
// 动态渲染思路
// 每次渲染25个
// 进度条长度被渲染数量影响
// 进度条value被改变到30以下渲染更多个
public void ChangeScrollBarLong(){
// var scrollContainer = GetNode<HScrollBar>("HScrollBar");
// scrollContainer.Size = new Vector2(100, 100);
var scrollContainer = GetNode<HScrollBar>("HScrollBar");
scrollContainer.MaxValue += 50;
}

public async void SaveScrollBarChange(float value){
// 原来可以传参执行
// var scrollContainer = GetNode<HScrollBar>("HScrollBar");

// GD.Print("Horizontal Scroll Value: " + scrollContainer.Value);
var HFlowContainer = GetNode<HFlowContainer>("HFlowContainer");
HFlowContainer.SetPosition(new Vector2(130, 180-value*20));

// 级别范围判定
// 两个值

// 每当滚动条的值增加10时,增加一次列表内容
// 硬编码级别 或者 算法
// 设置一个范围
// 检查内容级别

// 思考规律 20~30~40~50~60~70~80~90~100
// 每个内容级别内容不同
// 那么,逻辑就是,多减少增
int level = (int)(value / 10);
int NowLevel = SaveFileIndex / 10;
GD.Print(level);
GD.Print(NowLevel);


if (level > NowLevel)
{
// 增加少就增加一次捏
SaveFileIndex+=5;
for (int i = SaveFileIndex; i < SaveFileIndex+5; i++)
{
await ToSignal(GetTree().CreateTimer(0.3f), "timeout");

string ButtonName = "空存档";
if (i < SaveFiles.Count()){
ButtonName = SaveFiles[i];
}
var button = new Button
{
Text = ButtonName
};
button.SetCustomMinimumSize(new Vector2(300, 170));
HFlowContainer.AddChild(button); // 添加按钮到 GridContainer
}
}

// 考虑 MaxValue 的等级是否和 level 一致
// if (level > 8) // scrollContainer.MaxValue
// {
// // 调用事件或函数处理逻辑
// ChangeScrollBarLong();
// }
}


// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{

}

private static List<string> GetSaveFiles()
{
// 打开 user:// 目录
using var dir = DirAccess.Open("user://save");

// 获取文件列表
string[] files = dir.GetFiles();
List<string> fileList = new List<string>(files);

// 删除不以 ".res" 结尾的文件
fileList.RemoveAll(file => !file.EndsWith(".res"));
return fileList;
}
}