Compare commits

...

5 Commits

Author SHA1 Message Date
1c589ac3be Merge pull request 'master' (#40) from Alienjack/AxibugEmuOnline:master into master
Reviewed-on: #40
2024-11-07 19:42:12 +08:00
ALIENJACK\alien
12716c77c8 房间列表事件监听 2024-11-07 19:38:48 +08:00
ALIENJACK\alien
dfee4fa002 Room列表迭代 2024-11-07 19:23:59 +08:00
ALIENJACK\alien
9f732c7719 房间列表获取,调用实装 2024-11-07 19:18:50 +08:00
ALIENJACK\alien
88313eee6b IEmuCore接口增加获取gameObject的方法,完善游戏中和UI操作的操作集切换功能 2024-11-07 17:58:20 +08:00
13 changed files with 167 additions and 66 deletions

View File

@ -6,12 +6,15 @@ namespace AxibugEmuOnline.Client
{ {
public interface IEmuCore public interface IEmuCore
{ {
GameObject gameObject { get; }
object GetState(); object GetState();
byte[] GetStateBytes(); byte[] GetStateBytes();
void LoadState(object state); void LoadState(object state);
void LoadStateFromBytes(byte[] data); void LoadStateFromBytes(byte[] data);
void Pause(); void Pause();
void Resume(); void Resume();
void SetupScheme(); void SetupScheme();
void StartGame(RomFile romFile);
} }
} }

View File

@ -1,4 +1,5 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using MyNes.Core;
using UnityEngine; using UnityEngine;
namespace AxibugEmuOnline.Client.Manager namespace AxibugEmuOnline.Client.Manager
@ -6,6 +7,7 @@ namespace AxibugEmuOnline.Client.Manager
public class AppEmu public class AppEmu
{ {
private GameObject m_emuInstance; private GameObject m_emuInstance;
private IEmuCore m_emuCore;
public void BeginGame(RomFile romFile) public void BeginGame(RomFile romFile)
{ {
@ -14,14 +16,17 @@ namespace AxibugEmuOnline.Client.Manager
switch (romFile.Platform) switch (romFile.Platform)
{ {
case EnumPlatform.NES: case EnumPlatform.NES:
var nesEmu = GameObject.Instantiate(Resources.Load<GameObject>("NES/NesEmulator")).GetComponent<NesEmulator>(); m_emuCore = GameObject.Instantiate(Resources.Load<GameObject>("NES/NesEmulator")).GetComponent<IEmuCore>();
m_emuInstance = nesEmu.gameObject;
nesEmu.StartGame(romFile);
LaunchUI.Instance.HideMainMenu();
InGameUI.Instance.Show(romFile, nesEmu);
break; break;
} }
m_emuInstance = m_emuCore.gameObject;
m_emuCore.StartGame(romFile);
LaunchUI.Instance.HideMainMenu();
InGameUI.Instance.Show(romFile, m_emuCore);
m_emuCore.SetupScheme();
} }
public void StopGame() public void StopGame()
@ -32,6 +37,8 @@ namespace AxibugEmuOnline.Client.Manager
InGameUI.Instance.Hide(); InGameUI.Instance.Hide();
LaunchUI.Instance.ShowMainMenu(); LaunchUI.Instance.ShowMainMenu();
ControlScheme.Current = ControlSchemeSetts.Normal;
} }
} }
} }

View File

@ -89,7 +89,7 @@ namespace AxibugEmuOnline.Client.Manager
List<Protobuf_Room_MiniInfo> result = new List<Protobuf_Room_MiniInfo>(); List<Protobuf_Room_MiniInfo> result = new List<Protobuf_Room_MiniInfo>();
foreach (var item in dictRoomListID2Info) foreach (var item in dictRoomListID2Info)
{ {
result.Add(new Protobuf_Room_MiniInfo()); result.Add(item.Value);
} }
return result; return result;
} }
@ -204,12 +204,12 @@ namespace AxibugEmuOnline.Client.Manager
if (msg.UpdateType == 0) if (msg.UpdateType == 0)
{ {
AddOrUpdateRoomList(msg.RoomMiniInfo); AddOrUpdateRoomList(msg.RoomMiniInfo);
Eventer.Instance.PostEvent(EEvent.OnRoomListSingleUpdate, msg.RoomMiniInfo.GameRomID); Eventer.Instance.PostEvent(EEvent.OnRoomListSingleUpdate, msg.RoomMiniInfo.RoomID);
} }
else else
{ {
RemoveRoomList(msg.RoomMiniInfo.GameRomID); RemoveRoomList(msg.RoomMiniInfo.RoomID);
Eventer.Instance.PostEvent(EEvent.OnRoomListSingleClose, msg.RoomMiniInfo.GameRomID); Eventer.Instance.PostEvent(EEvent.OnRoomListSingleClose, msg.RoomMiniInfo.RoomID);
} }
} }

View File

@ -74,8 +74,12 @@ namespace AxibugEmuOnline.Client
} }
} }
//键位映射表需要在按键响应的堆栈结束后处理,防止迭代器修改问题
if (m_waitMapperSetting != null) if (m_waitMapperSetting != null)
{
m_keyMapper = m_waitMapperSetting; m_keyMapper = m_waitMapperSetting;
m_waitMapperSetting = null;
}
} }
private Dictionary<KeyCode, EnumCommand> m_waitMapperSetting = null; private Dictionary<KeyCode, EnumCommand> m_waitMapperSetting = null;

View File

@ -12,7 +12,7 @@ namespace AxibugEmuOnline.Client
public override bool Enable => gameObject.activeInHierarchy; public override bool Enable => gameObject.activeInHierarchy;
/// <summary> 指示该游戏实例是否处于联网模式 </summary> /// <summary> 指示该游戏实例是否处于联网模式 </summary>
public bool IsOnline => App.roomMgr.RoomState > AxibugProtobuf.RoomGameState.OnlyHost; public bool IsOnline => App.user.IsLoggedIn ? App.roomMgr.RoomState > AxibugProtobuf.RoomGameState.OnlyHost : false;
private RomFile m_rom; private RomFile m_rom;
public IEmuCore Core { get; private set; } public IEmuCore Core { get; private set; }
@ -57,6 +57,7 @@ namespace AxibugEmuOnline.Client
public void Show(RomFile currentRom, IEmuCore core) public void Show(RomFile currentRom, IEmuCore core)
{ {
m_state = null;//清空游戏快照
CommandDispatcher.Instance.RegistController(this); CommandDispatcher.Instance.RegistController(this);
m_rom = currentRom; m_rom = currentRom;
@ -69,6 +70,7 @@ namespace AxibugEmuOnline.Client
} }
Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomWaitStepChange, OnServerStepUpdate); Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomWaitStepChange, OnServerStepUpdate);
OptionUI.Instance.OnHide += PopMenu_OnHide;
gameObject.SetActiveEx(true); gameObject.SetActiveEx(true);
} }
@ -82,14 +84,28 @@ namespace AxibugEmuOnline.Client
{ {
CommandDispatcher.Instance.UnRegistController(this); CommandDispatcher.Instance.UnRegistController(this);
OptionUI.Instance.OnHide -= PopMenu_OnHide;
gameObject.SetActiveEx(false); gameObject.SetActiveEx(false);
} }
protected override void OnCmdOptionMenu() protected override void OnCmdOptionMenu()
{ {
OptionUI.Instance.Pop(menus); OptionUI.Instance.Pop(menus);
if (!IsOnline)//单人模式暂停模拟器
{
Core.Pause();
}
} }
//菜单关闭时候
private void PopMenu_OnHide()
{
if (!IsOnline)//单人模式恢复模拟器的暂停
Core.Resume();
}
public void QuitGame() public void QuitGame()
{ {
Eventer.Instance.UnregisterEvent<int>(EEvent.OnRoomWaitStepChange, OnServerStepUpdate); Eventer.Instance.UnregisterEvent<int>(EEvent.OnRoomWaitStepChange, OnServerStepUpdate);

View File

@ -1,6 +1,5 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using System.Diagnostics; using System.Diagnostics;
using VirtualNes.Core;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {
@ -16,10 +15,14 @@ namespace AxibugEmuOnline.Client
public override void OnExcute() public override void OnExcute()
{ {
object state = m_gameUI.GetQuickState();
Stopwatch sw = Stopwatch.StartNew(); Stopwatch sw = Stopwatch.StartNew();
m_gameUI.Core.LoadState(m_gameUI.GetQuickState()); if (state != null)
sw.Stop(); {
App.log.Info($"{m_gameUI.RomFile.Platform}====>快照加载耗时:{sw.Elapsed.TotalMilliseconds}ms"); m_gameUI.Core.LoadState(state);
sw.Stop();
App.log.Info($"{m_gameUI.RomFile.Platform}====>快照加载耗时:{sw.Elapsed.TotalMilliseconds}ms");
}
} }
} }
} }

View File

@ -517,6 +517,7 @@ public class ItemPresent : GridLayoutGroup, IVirtualLayout
} }
public RectTransform GetItemUIIfExist(int index) public RectTransform GetItemUIIfExist(int index)
{ {
if (index < 0) return null;
if (children.Count <= index) return null; if (children.Count <= index) return null;
var proxy = children[index]; var proxy = children[index];

View File

@ -37,6 +37,11 @@ namespace AxibugEmuOnline.Client.UI
Reset(); Reset();
} }
protected virtual void OnDestroy()
{
}
public void SetData(MenuData data) public void SetData(MenuData data)
{ {
Reset(); Reset();

View File

@ -24,6 +24,8 @@ namespace AxibugEmuOnline.Client
private bool m_bPoped = false; private bool m_bPoped = false;
private List<OptionUI_MenuItem> m_runtimeMenuItems = new List<OptionUI_MenuItem>(); private List<OptionUI_MenuItem> m_runtimeMenuItems = new List<OptionUI_MenuItem>();
public event Action OnHide;
private int m_selectIndex = -1; private int m_selectIndex = -1;
public int SelectIndex public int SelectIndex
{ {
@ -178,6 +180,8 @@ namespace AxibugEmuOnline.Client
m_bPoped = false; m_bPoped = false;
ControlScheme.Current = m_lastCS; ControlScheme.Current = m_lastCS;
OnHide?.Invoke();
} }
} }

View File

@ -1,7 +1,7 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event;
using AxibugEmuOnline.Client.UI; using AxibugEmuOnline.Client.UI;
using AxibugProtobuf; using AxibugProtobuf;
using System;
using UnityEngine; using UnityEngine;
using UnityEngine.UI; using UnityEngine.UI;
@ -21,28 +21,55 @@ namespace AxibugEmuOnline.Client
private RomFile m_romFile; private RomFile m_romFile;
public int Index { get; set; } public int Index { get; set; }
public int roomID { get; private set; }
protected override void Awake()
{
base.Awake();
Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomListSingleUpdate, OnRoomSingleUpdate);
}
protected override void OnDestroy()
{
Eventer.Instance.UnregisterEvent<int>(EEvent.OnRoomListSingleUpdate, OnRoomSingleUpdate);
}
private void OnRoomSingleUpdate(int roomId)
{
if (roomId != roomID) return;
if (App.roomMgr.GetRoomListMiniInfo(roomId, out var roomInfo))
{
UpdateUI(roomInfo);
}
}
public void SetData(object data) public void SetData(object data)
{ {
if (data is Protobuf_Room_MiniInfo roomInfo) var roomInfo = data as Protobuf_Room_MiniInfo;
roomID = roomInfo.RoomID;
UpdateUI(roomInfo);
}
private void UpdateUI(Protobuf_Room_MiniInfo roomInfo)
{
var hostNick = roomInfo.GetHostNickName();
roomInfo.GetRoomPlayers(out var cur, out var max);
SetBaseInfo(string.Empty, $"<b>{hostNick}</b>µÄ·¿¼ä - {cur}/{max}");
SetIcon(null);
roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (romFile) =>
{ {
var hostNick = roomInfo.GetHostNickName(); m_romFile = romFile;
roomInfo.GetRoomPlayers(out var cur, out var max);
SetBaseInfo(string.Empty, $"<b>{hostNick}</b>ľÄˇżźä - {cur}/{max}");
SetIcon(null);
roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (romFile) => if (romFile.ID == roomInfo.GameRomID)
{ Txt.text = romFile.Alias;
m_romFile = romFile;
if (romFile.ID == roomInfo.GameRomID) UpdateRomInfoView();
Txt.text = romFile.Alias; App.CacheMgr.GetSpriteCache(romFile.ImageURL, OnGetRomImage);
});
UpdateRomInfoView();
App.CacheMgr.GetSpriteCache(romFile.ImageURL, OnGetRomImage);
});
}
} }
private void Update() private void Update()

View File

@ -1,34 +1,61 @@
using AxibugEmuOnline.Client.ClientCore; using AxibugEmuOnline.Client.ClientCore;
using AxibugProtobuf; using AxibugEmuOnline.Client.Event;
using System; using System;
using System.Collections;
using System.Collections.Generic;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {
public class RoomListMenuItem : VirtualSubMenuItem public class RoomListMenuItem : VirtualSubMenuItem
{ {
bool m_entering;
protected override void Awake()
{
Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomListAllUpdate, OnRoomListUpdateAll);
Eventer.Instance.RegisterEvent<int>(EEvent.OnRoomListSingleClose, OnRoomClosed);
base.Awake();
}
protected override void OnDestroy()
{
Eventer.Instance.UnregisterEvent<int>(EEvent.OnRoomListAllUpdate, OnRoomListUpdateAll);
Eventer.Instance.UnregisterEvent<int>(EEvent.OnRoomListSingleClose, OnRoomClosed);
}
public override bool OnEnterItem()
{
var res = base.OnEnterItem();
if (res) m_entering = true;
return res;
}
public override bool OnExitItem()
{
var res = base.OnExitItem();
if (res) m_entering = false;
return res;
}
private void OnRoomListUpdateAll(int obj)
{
if (m_entering)
{
RefreshUI();
}
}
private void OnRoomClosed(int obj)
{
if (m_entering)
{
RefreshUI();
}
}
protected override void GetVirtualListDatas(Action<object> datas) protected override void GetVirtualListDatas(Action<object> datas)
{ {
App.StartCoroutine(Test(datas)); var roomList = App.roomMgr.GetRoomList();
datas.Invoke(roomList);
} }
private IEnumerator Test(Action<object> datas)
{
yield return null;
List<Protobuf_Room_MiniInfo> fakeData = new List<Protobuf_Room_MiniInfo>()
{
new Protobuf_Room_MiniInfo{ GameRomID = 1, RoomID = 1, HostPlayerUID = 1, Player1UID = 1, Player1NickName = "Test1"},
new Protobuf_Room_MiniInfo{ GameRomID = 2, RoomID = 2, HostPlayerUID = 2, Player1UID = 2, Player1NickName = "Test2"},
new Protobuf_Room_MiniInfo{ GameRomID = 3, RoomID = 3, HostPlayerUID = 3, Player1UID = 3, Player1NickName = "Test3"},
new Protobuf_Room_MiniInfo{ GameRomID = 4, RoomID = 4, HostPlayerUID = 4, Player1UID = 4, Player1NickName = "Test4"},
new Protobuf_Room_MiniInfo{ GameRomID = 5, RoomID = 5, HostPlayerUID = 5, Player1UID = 5, Player1NickName = "Test5"},
};
datas.Invoke(fakeData);
yield break;
}
} }
} }

View File

@ -47,7 +47,7 @@ namespace AxibugEmuOnline.Client
protected override MenuItem GetItemUIByIndex(int index) protected override MenuItem GetItemUIByIndex(int index)
{ {
return itemGroup.GetItemUIByDataIndex(index).GetComponent<MenuItem>(); return itemGroup.GetItemUIByDataIndex(index)?.GetComponent<MenuItem>();
} }
protected override void Awake() protected override void Awake()
@ -63,13 +63,16 @@ namespace AxibugEmuOnline.Client
protected override bool OnCmdEnter() protected override bool OnCmdEnter()
{ {
var item = GetItemUIByIndex(SelectIndex); var item = GetItemUIByIndex(SelectIndex);
return item.OnEnterItem(); if (item != null)
return item.OnEnterItem();
else
return true;
} }
protected override void OnCmdBack() protected override void OnCmdBack()
{ {
var item = GetItemUIByIndex(SelectIndex); var item = GetItemUIByIndex(SelectIndex);
item.OnExitItem(); item?.OnExitItem();
} }
private void LateUpdate() private void LateUpdate()

View File

@ -3,11 +3,7 @@ using DG.Tweening;
using DG.Tweening.Core; using DG.Tweening.Core;
using DG.Tweening.Plugins.Options; using DG.Tweening.Plugins.Options;
using System; using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using VirtualNes.Core;
using App = AxibugEmuOnline.Client.ClientCore.App;
namespace AxibugEmuOnline.Client namespace AxibugEmuOnline.Client
{ {
@ -15,7 +11,7 @@ namespace AxibugEmuOnline.Client
{ {
[SerializeField] [SerializeField]
protected CanvasGroup RomGroupRoot; protected CanvasGroup RomGroupRoot;
private TweenerCore<float, float, FloatOptions> m_showTween; private TweenerCore<float, float, FloatOptions> m_showTween;
@ -60,7 +56,16 @@ namespace AxibugEmuOnline.Client
var thirdMenuGroup = SubMenuItemGroup as ThirdMenuRoot; var thirdMenuGroup = SubMenuItemGroup as ThirdMenuRoot;
thirdMenuGroup.itemGroup.Clear(); thirdMenuGroup.itemGroup.Clear();
RefreshUI();
if (SubMenuItemGroup != null) SubMenuItemGroup.SetSelect(true);
return true;
}
protected void RefreshUI()
{
GetVirtualListDatas((datas) => GetVirtualListDatas((datas) =>
{ {
var thirdMenuGroup = SubMenuItemGroup as ThirdMenuRoot; var thirdMenuGroup = SubMenuItemGroup as ThirdMenuRoot;
@ -69,10 +74,6 @@ namespace AxibugEmuOnline.Client
thirdMenuGroup.itemGroup.UpdateProxyVisualState(); thirdMenuGroup.itemGroup.UpdateProxyVisualState();
thirdMenuGroup.ResetToFirst(); thirdMenuGroup.ResetToFirst();
}); });
if (SubMenuItemGroup != null) SubMenuItemGroup.SetSelect(true);
return true;
} }
protected abstract void GetVirtualListDatas(Action<object> datas); protected abstract void GetVirtualListDatas(Action<object> datas);