using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.Event; using System.Collections.Generic; namespace AxibugEmuOnline.Client { public class InGameUI : CommandExecuter { public static InGameUI Instance { get; private set; } public RomFile RomFile => m_rom; public override bool Enable => gameObject.activeInHierarchy; /// 指示该游戏实例是否处于联机模式 public bool IsNetPlay { get { if (!App.user.IsLoggedIn) return false; if (App.roomMgr.mineRoomMiniInfo == null) return false; if (App.roomMgr.RoomState <= AxibugProtobuf.RoomGameState.OnlyHost) return false; return true; } } private RomFile m_rom; public IEmuCore Core { get; private set; } private object m_state; private List menus = new List(); private StepPerformer m_stepPerformer; protected override void Awake() { Instance = this; gameObject.SetActiveEx(false); m_stepPerformer = new StepPerformer(this); menus.Add(new InGameUI_SaveState(this)); menus.Add(new InGameUI_LoadState(this)); menus.Add(new InGameUI_QuitGame(this)); base.Awake(); } private void OnDestroy() { Instance = null; } /// 保存快速快照 public void SaveQuickState(object state) { m_state = state; } /// /// 读取快速快照 /// /// /// public object GetQuickState() { return m_state; } public void Show(RomFile currentRom, IEmuCore core) { m_state = null;//清空游戏快照 CommandDispatcher.Instance.RegistController(this); m_rom = currentRom; Core = core; m_stepPerformer.Reset(); if (App.user.IsLoggedIn) { App.roomMgr.SendCreateRoom(m_rom.ID, 0, m_rom.Hash); } Eventer.Instance.RegisterEvent(EEvent.OnRoomWaitStepChange, OnServerStepUpdate); OptionUI.Instance.OnHide += PopMenu_OnHide; gameObject.SetActiveEx(true); } private void OnServerStepUpdate(int step) { m_stepPerformer.Perform(step); } public void Hide() { CommandDispatcher.Instance.UnRegistController(this); OptionUI.Instance.OnHide -= PopMenu_OnHide; gameObject.SetActiveEx(false); } protected override void OnCmdOptionMenu() { OptionUI.Instance.Pop(menus); if (!IsNetPlay)//单人模式暂停模拟器 { Core.Pause(); } } //菜单关闭时候 private void PopMenu_OnHide() { if (!IsNetPlay)//单人模式恢复模拟器的暂停 Core.Resume(); } public void QuitGame() { Eventer.Instance.UnregisterEvent(EEvent.OnRoomWaitStepChange, OnServerStepUpdate); App.roomMgr.SendLeavnRoom(); App.emu.StopGame(); ControlScheme.Current = ControlSchemeSetts.Normal; } } }