实现存档以及读取存档功能

This commit is contained in:
Alienjack 2025-04-13 19:03:43 +08:00
parent f325e63e26
commit 3dc7e9acd1
5 changed files with 80 additions and 18 deletions

View File

@ -38,6 +38,8 @@ namespace AxibugEmuOnline.Client
}
}
public event Action OnSavSuccessed;
/// <summary> 存档顺序号,用于判断云存档和本地存档的同步状态,是否存在冲突 </summary>
public uint Sequecen { get; private set; }
@ -179,6 +181,8 @@ namespace AxibugEmuOnline.Client
m_screenShotCaches = screenShotData;
IsEmpty = false;
OnSavSuccessed?.Invoke();
}
/// <summary>

View File

@ -9,7 +9,7 @@ namespace AxibugEmuOnline.Client
{
private InGameUI m_gameUI;
public override string Name => "存";
public override string Name => "";
public InGameUI_SaveStateMenu(InGameUI inGameUI)
{
@ -22,39 +22,81 @@ namespace AxibugEmuOnline.Client
List<InternalOptionMenu> result = new List<InternalOptionMenu>();
foreach (var savFile in saveFiles)
{
if (savFile.AutoSave) continue;
result.Add(new SaveSlotMenu(m_gameUI, savFile));
}
return result;
}
/// <summary> 存档侧边选项UI </summary>
public class SaveSlotMenu : ExecuteMenu
public class SaveSlotMenu : ExpandMenu
{
public override Type MenuUITemplateType => typeof(OptionUI_SavSlotItem);
public SaveFile SavFile { get; private set; }
private InGameUI m_ingameUI;
public override bool Visible => !SavFile.AutoSave;
List<InternalOptionMenu> m_subOptions = new List<InternalOptionMenu>();
public override string Name => SavFile.AutoSave ? "自动存档" : $"存档{SavFile.SlotIndex}";
public SaveSlotMenu(InGameUI inGameui, SaveFile savFile)
{
SavFile = savFile;
//非自动存档,增加保存选项
if (!savFile.AutoSave) m_subOptions.Add(new SaveMenuItem(inGameui, savFile));
//添加读取选项
m_subOptions.Add(new LoadMenuItem(inGameui, savFile));
}
protected override List<InternalOptionMenu> GetOptionMenus()
{
return m_subOptions;
}
public class SaveMenuItem : ExecuteMenu
{
SaveFile m_savFile;
InGameUI m_ingameUI;
public override string Name => "保存";
public SaveMenuItem(InGameUI inGameui, SaveFile savFile)
{
m_ingameUI = inGameui;
m_savFile = savFile;
}
public override void OnExcute(OptionUI optionUI, ref bool cancelHide)
{
var stateData = m_ingameUI.Core.GetStateBytes();
var tex = m_ingameUI.Core.OutputPixel;
var screenData = tex.ToJPG();
m_savFile.Save(m_savFile.Sequecen, stateData, screenData);
}
}
public class LoadMenuItem : ExecuteMenu
{
SaveFile m_savFile;
InGameUI m_ingameUI;
public override string Name => "读取";
public LoadMenuItem(InGameUI inGameui, SaveFile savFile)
{
m_ingameUI = inGameui;
m_savFile = savFile;
}
public override void OnExcute(OptionUI optionUI, ref bool cancelHide)
{
cancelHide = true;
var stateData = m_ingameUI.Core.GetStateBytes();
var tex = m_ingameUI.Core.OutputPixel;
var screenData = tex.ToJPG();
SavFile.Save(SavFile.Sequecen, stateData, screenData);
m_savFile.GetSavData(out byte[] savData, out var _);
if (savData != null)
{
m_ingameUI.Core.LoadStateFromBytes(savData);
}
public override string Name => SavFile.AutoSave ? "自动存档" : $"存档{SavFile.SlotIndex}";
OverlayManager.HideSideBar();
}
}
}
}
}

View File

@ -221,14 +221,21 @@ namespace AxibugEmuOnline.Client
}
/// <summary>
/// 关闭这个侧边栏选项UI
/// </summary>
public void Hide()
{
if (m_bPoped)
{
if (m_child != null)
{
m_child.Hide();
}
Vector2 start = new Vector2(-MenuRoot.rect.width, MenuRoot.anchoredPosition.y);
Vector2 end = new Vector2(0, MenuRoot.anchoredPosition.y);
ReleaseRuntimeMenus();
m_runtimeMenuItems.Clear();

View File

@ -17,6 +17,8 @@ namespace AxibugEmuOnline.Client
base.OnSetData(menuData);
RefreshUI();
MenuData.SavFile.OnSavSuccessed += RefreshUI;
}
private void RefreshUI()
@ -57,12 +59,13 @@ namespace AxibugEmuOnline.Client
Destroy(m_screenTex);
m_screenTex = null;
}
MenuData.SavFile.OnSavSuccessed -= RefreshUI;
}
public override void OnExecute(OptionUI optionUI, ref bool cancelHide)
{
MenuData.OnExcute(optionUI, ref cancelHide);
RefreshUI();
}
}
}

View File

@ -39,9 +39,15 @@ namespace AxibugEmuOnline.Client
s_ins.m_OptionUI.Pop(menus, defaultIndex, onClose);
}
public static void HideSideBar()
{
s_ins.m_OptionUI.Hide();
}
public static void PopTip(string msg)
{
s_ins.m_popTipsUI.Pop(msg);
}
}
}