diff --git a/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs b/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs
index a054acf..34c04d6 100644
--- a/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/IEmuCore.cs
@@ -1,5 +1,3 @@
-using System.Collections;
-using System.Collections.Generic;
using UnityEngine;
namespace AxibugEmuOnline.Client
@@ -17,4 +15,13 @@ namespace AxibugEmuOnline.Client
void SetupScheme();
void StartGame(RomFile romFile);
}
+
+ public static class IEnumCoreTool
+ {
+ public static bool IsNull(this IEmuCore core)
+ {
+ if (core == null) return true;
+ return core.Equals(null);
+ }
+ }
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs
index 4b59524..697bf68 100644
--- a/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs
@@ -1,17 +1,47 @@
using AxibugEmuOnline.Client.ClientCore;
+using AxibugEmuOnline.Client.Event;
using MyNes.Core;
+using System;
using UnityEngine;
namespace AxibugEmuOnline.Client.Manager
{
public class AppEmu
{
- private GameObject m_emuInstance;
+ ///
+ /// unity的c#实现有bug,以接口类型保存的monobehaviour引用,!=和==运算符没有调用到monobehaviour重写过的运算符
+ /// 但是Equals方法可以,所以,这个接口判断为空请使用Equals
+ ///
private IEmuCore m_emuCore;
+ public AppEmu()
+ {
+ Eventer.Instance.RegisterEvent(EEvent.OnMineJoinRoom, OnSelfJoinRoom);
+ }
+
+ private void OnSelfJoinRoom()
+ {
+ //如果当前正在游戏中,就先结束游戏
+ if (!m_emuCore.IsNull()) StopGame();
+
+ var roomInfo = App.roomMgr.mineRoomMiniInfo;
+ roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (room, romFile) =>
+ {
+ if (!romFile.RomReady) //这个rom并没有下载,所以取消进入房间
+ {
+ App.roomMgr.SendLeavnRoom();
+ }
+ else
+ {
+ BeginGame(romFile);
+ }
+ });
+ }
+
+
public void BeginGame(RomFile romFile)
{
- if (m_emuInstance != null) return;
+ if (!m_emuCore.Equals(null)) return;
switch (romFile.Platform)
{
@@ -20,8 +50,6 @@ namespace AxibugEmuOnline.Client.Manager
break;
}
- m_emuInstance = m_emuCore.gameObject;
-
m_emuCore.StartGame(romFile);
LaunchUI.Instance.HideMainMenu();
InGameUI.Instance.Show(romFile, m_emuCore);
@@ -31,9 +59,9 @@ namespace AxibugEmuOnline.Client.Manager
public void StopGame()
{
- if (m_emuInstance == null) return;
- GameObject.Destroy(m_emuInstance);
- m_emuInstance = null;
+ if (m_emuCore.IsNull()) return;
+ GameObject.Destroy(m_emuCore.gameObject);
+ m_emuCore = null;
InGameUI.Instance.Hide();
LaunchUI.Instance.ShowMainMenu();
diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/RomLib/RomFile.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/RomLib/RomFile.cs
index a4eb71a..0508534 100644
--- a/AxibugEmuOnline.Client/Assets/Script/Manager/RomLib/RomFile.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/Manager/RomLib/RomFile.cs
@@ -48,7 +48,7 @@ namespace AxibugEmuOnline.Client
public int Page { get; private set; }
public string Hash => webData != null ? webData.hash : string.Empty;
- public event Action OnDownloadOver;
+ public event Action OnDownloadOver;
public event Action OnInfoFilled;
public RomFile(EnumPlatform platform, int index, int insidePage)
@@ -73,7 +73,7 @@ namespace AxibugEmuOnline.Client
File.WriteAllBytes(LocalFilePath, bytes);
hasLocalFile = true;
}
- OnDownloadOver?.Invoke();
+ OnDownloadOver?.Invoke(this);
}));
}
@@ -115,13 +115,16 @@ namespace AxibugEmuOnline.Client
downloadRequest = UnityWebRequest.Get($"{App.httpAPI.WebHost}/{webData.url}");
yield return downloadRequest.SendWebRequest();
- if (downloadRequest.result != UnityWebRequest.Result.Success)
+ var request = downloadRequest;
+ downloadRequest = null;
+
+ if (request.result != UnityWebRequest.Result.Success)
{
callback(null);
}
else
{
- callback(downloadRequest.downloadHandler.data);
+ callback(request.downloadHandler.data);
}
}
diff --git a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs
index 4061b1c..69d64fe 100644
--- a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs
@@ -69,7 +69,6 @@ namespace AxibugEmuOnline.Client
}
}
-
public void Pause()
{
m_bPause = true;
diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/InGameUI/StepPerformer.cs b/AxibugEmuOnline.Client/Assets/Script/UI/InGameUI/StepPerformer.cs
index 9564601..1b3f342 100644
--- a/AxibugEmuOnline.Client/Assets/Script/UI/InGameUI/StepPerformer.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/UI/InGameUI/StepPerformer.cs
@@ -18,7 +18,6 @@ namespace AxibugEmuOnline.Client
{
m_step = step;
-
switch (m_step)
{
//等待主机上报快照
diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/RoomItem.cs b/AxibugEmuOnline.Client/Assets/Script/UI/RoomItem.cs
index 56016ee..6db698c 100644
--- a/AxibugEmuOnline.Client/Assets/Script/UI/RoomItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/UI/RoomItem.cs
@@ -2,6 +2,7 @@ using AxibugEmuOnline.Client.ClientCore;
using AxibugEmuOnline.Client.Event;
using AxibugEmuOnline.Client.UI;
using AxibugProtobuf;
+using System;
using UnityEngine;
using UnityEngine.UI;
@@ -27,22 +28,15 @@ namespace AxibugEmuOnline.Client
{
base.Awake();
- Eventer.Instance.RegisterEvent(EEvent.OnRoomListSingleUpdate, OnRoomSingleUpdate);
+ Eventer.Instance.RegisterEvent(EEvent.OnRoomListSingleUpdate, OnRoomSignelUpdate);
}
- protected override void OnDestroy()
+ private void OnRoomSignelUpdate(int roomID)
{
- Eventer.Instance.UnregisterEvent(EEvent.OnRoomListSingleUpdate, OnRoomSingleUpdate);
- }
+ if (this.roomID != roomID) return;
- private void OnRoomSingleUpdate(int roomId)
- {
- if (roomId != roomID) return;
-
- if (App.roomMgr.GetRoomListMiniInfo(roomId, out var roomInfo))
- {
+ if (App.roomMgr.GetRoomListMiniInfo(roomID, out var roomInfo))
UpdateUI(roomInfo);
- }
}
public void SetData(object data)
@@ -53,6 +47,20 @@ namespace AxibugEmuOnline.Client
UpdateUI(roomInfo);
}
+ public override bool OnEnterItem()
+ {
+ if (!m_romFile.RomReady)
+ {
+ m_romFile.BeginDownload();
+ return false;
+ }
+ else
+ {
+ App.roomMgr.SendJoinRoom(roomID, 1);
+ return true;
+ }
+ }
+
private void UpdateUI(Protobuf_Room_MiniInfo roomInfo)
{
var hostNick = roomInfo.GetHostNickName();
@@ -60,12 +68,12 @@ namespace AxibugEmuOnline.Client
SetBaseInfo(string.Empty, $"{hostNick}ķ - {cur}/{max}");
SetIcon(null);
- roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (romFile) =>
+ roomInfo.FetchRomFileInRoomInfo(EnumPlatform.NES, (room, romFile) =>
{
- m_romFile = romFile;
+ if (room.RoomID != roomID) return;
- if (romFile.ID == roomInfo.GameRomID)
- Txt.text = romFile.Alias;
+ m_romFile = romFile;
+ Txt.text = romFile.Alias;
UpdateRomInfoView();
App.CacheMgr.GetSpriteCache(romFile.ImageURL, OnGetRomImage);
diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/RoomListMenuItem.cs b/AxibugEmuOnline.Client/Assets/Script/UI/RoomListMenuItem.cs
index 4514913..48a2fb3 100644
--- a/AxibugEmuOnline.Client/Assets/Script/UI/RoomListMenuItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/UI/RoomListMenuItem.cs
@@ -12,6 +12,7 @@ namespace AxibugEmuOnline.Client
{
Eventer.Instance.RegisterEvent(EEvent.OnRoomListAllUpdate, OnRoomListUpdateAll);
Eventer.Instance.RegisterEvent(EEvent.OnRoomListSingleClose, OnRoomClosed);
+ Eventer.Instance.RegisterEvent(EEvent.OnRoomListSingleAdd, OnRoomSingleAdd);
base.Awake();
}
@@ -19,6 +20,7 @@ namespace AxibugEmuOnline.Client
protected override void OnDestroy()
{
Eventer.Instance.UnregisterEvent(EEvent.OnRoomListAllUpdate, OnRoomListUpdateAll);
+ Eventer.Instance.UnregisterEvent(EEvent.OnRoomListSingleUpdate, OnRoomSingleAdd);
Eventer.Instance.UnregisterEvent(EEvent.OnRoomListSingleClose, OnRoomClosed);
}
@@ -36,6 +38,14 @@ namespace AxibugEmuOnline.Client
return res;
}
+ private void OnRoomSingleAdd(int obj)
+ {
+ if (m_entering)
+ {
+ RefreshUI();
+ }
+ }
+
private void OnRoomListUpdateAll(int obj)
{
if (m_entering)
diff --git a/AxibugEmuOnline.Client/Assets/Script/UI/VirtualSubMenuItem.cs b/AxibugEmuOnline.Client/Assets/Script/UI/VirtualSubMenuItem.cs
index 9721a82..859d9de 100644
--- a/AxibugEmuOnline.Client/Assets/Script/UI/VirtualSubMenuItem.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/UI/VirtualSubMenuItem.cs
@@ -20,7 +20,7 @@ namespace AxibugEmuOnline.Client
base.Awake();
RomGroupRoot.gameObject.SetActive(false);
- RomGroupRoot.alpha = 0;
+ RomGroupRoot.alpha = 0;
}
public override void SetSelectState(bool selected)
@@ -58,7 +58,7 @@ namespace AxibugEmuOnline.Client
thirdMenuGroup.itemGroup.Clear();
RefreshUI();
-
+
if (SubMenuItemGroup != null) SubMenuItemGroup.SetSelect(true);
return true;
diff --git a/AxibugEmuOnline.Client/Assets/Script/Utility.cs b/AxibugEmuOnline.Client/Assets/Script/Utility.cs
index 58bc19b..973471a 100644
--- a/AxibugEmuOnline.Client/Assets/Script/Utility.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/Utility.cs
@@ -38,11 +38,11 @@ namespace AxibugEmuOnline.Client
}
private static Dictionary s_RomFileCahcesInRoomInfo = new Dictionary();
- public static void FetchRomFileInRoomInfo(this Protobuf_Room_MiniInfo roomInfo, EnumPlatform platform, Action callback)
+ public static void FetchRomFileInRoomInfo(this Protobuf_Room_MiniInfo roomInfo, EnumPlatform platform, Action callback)
{
if (s_RomFileCahcesInRoomInfo.TryGetValue(roomInfo.GameRomID, out RomFile romFile))
{
- callback.Invoke(romFile);
+ callback.Invoke(roomInfo,romFile);
return;
}
switch (platform)
@@ -52,9 +52,9 @@ namespace AxibugEmuOnline.Client
{
RomFile romFile = new RomFile(EnumPlatform.NES, 0, 0);
romFile.SetWebData(romWebData);
- callback.Invoke(romFile);
-
s_RomFileCahcesInRoomInfo[roomInfo.GameRomID] = romFile;
+
+ callback.Invoke(roomInfo,romFile);
}));
break;
}