forked from sin365/AxibugEmuOnline
Compare commits
7 Commits
9c4d57bdef
...
45539f3b92
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45539f3b92 | ||
| a4f8a382ac | |||
| ea2e63cb58 | |||
| 960aad4831 | |||
| 4606a57157 | |||
| 6ad26bba8e | |||
| 5bd858e1a5 |
@ -4,87 +4,66 @@ namespace AxiReplay
|
||||
{
|
||||
public class NetReplay
|
||||
{
|
||||
public int mCurrPlayFrame = -1;
|
||||
Queue<ReplayStep> mQueueReplay;
|
||||
ReplayStep mNextReplay;
|
||||
ReplayStep mCurrReplay;
|
||||
int byFrameIdx = 0;
|
||||
/// <summary>
|
||||
/// 客户端当前帧
|
||||
/// </summary>
|
||||
public int mCurrClientFrameIdx => mCurrReplay.FrameStartID;
|
||||
//public int mCurrClientFrameIdx
|
||||
/// <summary>
|
||||
/// 服务器远端当前帧
|
||||
/// </summary>
|
||||
public int mRemoteFrameIdx { get; private set; }
|
||||
public int mRemoteFrameIdx { get; private set; } = -1;
|
||||
/// <summary>
|
||||
/// 当前帧和服务器帧相差数量
|
||||
/// 网络数据队列
|
||||
/// </summary>
|
||||
public int remoteFrameDiff => mRemoteFrameIdx - mCurrPlayFrame;
|
||||
Queue<ReplayStep> mNetReplayQueue = new Queue<ReplayStep>();
|
||||
/// <summary>
|
||||
/// 当前数据
|
||||
/// </summary>
|
||||
ReplayStep mCurrReplay;
|
||||
/// <summary>
|
||||
/// 下一个数据数据
|
||||
/// </summary>
|
||||
ReplayStep mNextReplay;
|
||||
public NetReplay()
|
||||
{
|
||||
mQueueReplay = new Queue<ReplayStep>();
|
||||
ResetData();
|
||||
}
|
||||
|
||||
public void ResetData()
|
||||
{
|
||||
mQueueReplay.Clear();
|
||||
mNetReplayQueue.Clear();
|
||||
mRemoteFrameIdx = 0;
|
||||
byFrameIdx = 0;
|
||||
mNextReplay = default(ReplayStep);
|
||||
mCurrReplay = default(ReplayStep);
|
||||
mCurrReplay.FrameStartID = 0;
|
||||
mNextReplay = default(ReplayStep);
|
||||
mNextReplay.FrameStartID = -1;
|
||||
}
|
||||
public void InData(ReplayStep inputData,int ServerFrameIdx)
|
||||
public void InData(ReplayStep inputData, int ServerFrameIdx)
|
||||
{
|
||||
mQueueReplay.Enqueue(inputData);
|
||||
mNetReplayQueue.Enqueue(inputData);
|
||||
mRemoteFrameIdx = inputData.FrameStartID;
|
||||
}
|
||||
public bool NextFrame(out ReplayStep data, out int FrameDiff)
|
||||
public bool TryGetNextFrame(out ReplayStep data, out int frameDiff, out bool inputDiff)
|
||||
{
|
||||
return TakeFrame(0, out data, out FrameDiff);
|
||||
TakeFrame(1, out data, out frameDiff, out inputDiff);
|
||||
return frameDiff > 0;
|
||||
}
|
||||
/// <summary>
|
||||
/// 往前推进帧的,指定帧下标
|
||||
/// </summary>
|
||||
public bool NextFramebyFrameIdx(int FrameID, out ReplayStep data, out int FrameDiff)
|
||||
void TakeFrame(int addFrame, out ReplayStep data, out int bFrameDiff, out bool inputDiff)
|
||||
{
|
||||
bool res = TakeFrame(FrameID - byFrameIdx, out data, out FrameDiff);
|
||||
byFrameIdx = FrameID;
|
||||
return res;
|
||||
}
|
||||
public bool TakeFrame(int addFrame, out ReplayStep data, out int FrameDiff)
|
||||
{
|
||||
bool Changed = false;
|
||||
mCurrPlayFrame += addFrame;
|
||||
if (mCurrPlayFrame >= mNextReplay.FrameStartID)
|
||||
inputDiff = false;
|
||||
int targetFrame = mCurrClientFrameIdx + addFrame;
|
||||
if (targetFrame >= mNextReplay.FrameStartID && targetFrame <= mRemoteFrameIdx && mNetReplayQueue.Count > 0)
|
||||
{
|
||||
Changed = mCurrReplay.InPut != mNextReplay.InPut;
|
||||
//当前帧追加
|
||||
//mCurrClientFrameIdx = targetFrame;
|
||||
ulong oldInput = mCurrReplay.InPut;
|
||||
mCurrReplay = mNextReplay;
|
||||
data = mCurrReplay;
|
||||
UpdateNextFrame(mCurrPlayFrame, out FrameDiff);
|
||||
}
|
||||
else
|
||||
{
|
||||
data = mCurrReplay;
|
||||
FrameDiff = mRemoteFrameIdx - mCurrPlayFrame;
|
||||
}
|
||||
return Changed;
|
||||
}
|
||||
void UpdateNextFrame(int targetFrame,out int FrameDiff)
|
||||
{
|
||||
FrameDiff = mRemoteFrameIdx - targetFrame;
|
||||
//如果已经超过
|
||||
while (targetFrame > mNextReplay.FrameStartID)
|
||||
{
|
||||
if (mNextReplay.FrameStartID >= mRemoteFrameIdx)
|
||||
{
|
||||
//TODO
|
||||
//bEnd = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (mQueueReplay.Count > 0)
|
||||
{
|
||||
mNextReplay = mQueueReplay.Dequeue();
|
||||
}
|
||||
targetFrame++;
|
||||
if (oldInput != mCurrReplay.InPut)
|
||||
inputDiff = true;
|
||||
mNextReplay = mNetReplayQueue.Dequeue();
|
||||
}
|
||||
bFrameDiff = mRemoteFrameIdx - mCurrClientFrameIdx;
|
||||
data = mCurrReplay;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -826,7 +826,7 @@ GameObject:
|
||||
- component: {fileID: 6055880809428073973}
|
||||
- component: {fileID: 1286529697012677180}
|
||||
m_Layer: 5
|
||||
m_Name: RomGroup
|
||||
m_Name: RoomGroup
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
|
||||
@ -407,7 +407,8 @@ namespace AxibugEmuOnline.Client.Manager
|
||||
void RecvHostSyn_RoomFrameAllInputData(byte[] reqData)
|
||||
{
|
||||
Protobuf_Room_Syn_RoomFrameAllInputData msg = ProtoBufHelper.DeSerizlize<Protobuf_Room_Syn_RoomFrameAllInputData>(reqData);
|
||||
//netReplay.InData(new ReplayStep() { FrameStartID = (int)msg.FrameID, InPut = msg.InputData }, (int)msg.ServerFrameID);
|
||||
App.log.Debug($"ServerFrameID->{msg.ServerFrameID} FrameID->{msg.FrameID} ClientFrame->{netReplay.mCurrClientFrameIdx} InputData->{msg.InputData}");
|
||||
netReplay.InData(new ReplayStep() { FrameStartID = (int)msg.FrameID, InPut = msg.InputData }, (int)msg.ServerFrameID);
|
||||
}
|
||||
|
||||
public void SendScreen(byte[] RenderBuffer)
|
||||
|
||||
@ -6,7 +6,6 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
||||
@ -102,12 +102,12 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
if (InGameUI.Instance.IsNetPlay)
|
||||
{
|
||||
if (App.roomMgr.netReplay.NextFrame(out var replayData, out int _))
|
||||
if (App.roomMgr.netReplay.TryGetNextFrame(out var replayData, out int frameDiff, out bool inputDiff))
|
||||
{
|
||||
m_sampledState = FromNet(replayData);
|
||||
var localState = NesControllerMapper.Get().CreateState();
|
||||
var rawData = ToNet(localState);
|
||||
App.roomMgr.SendRoomSingelPlayerInput((uint)App.roomMgr.netReplay.mCurrPlayFrame, rawData);
|
||||
App.roomMgr.SendRoomSingelPlayerInput((uint)App.roomMgr.netReplay.mCurrClientFrameIdx, rawData);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@ -36,6 +36,14 @@ namespace AxibugEmuOnline.Client
|
||||
m_pulsInvoker_Down.Update(Time.deltaTime);
|
||||
}
|
||||
|
||||
public void ResetPulsInvoker()
|
||||
{
|
||||
m_pulsInvoker_Left.DisActive();
|
||||
m_pulsInvoker_Right.DisActive();
|
||||
m_pulsInvoker_Up.DisActive();
|
||||
m_pulsInvoker_Down.DisActive();
|
||||
}
|
||||
|
||||
public void ExecuteCommand(EnumCommand cmd, bool cancel)
|
||||
{
|
||||
if (!cancel)
|
||||
|
||||
@ -9,7 +9,6 @@ namespace AxibugEmuOnline.Client
|
||||
[SerializeField]
|
||||
protected Transform m_menuItemRoot;
|
||||
protected List<MenuItem> m_runtimeMenuUI = new List<MenuItem>();
|
||||
public override bool Enable => enabled;
|
||||
|
||||
protected MenuItem m_enteredItem = null;
|
||||
|
||||
@ -78,6 +77,8 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
public abstract class MenuItemController<T> : MenuItemController
|
||||
{
|
||||
public override bool Enable => enabled && ListenControlAction;
|
||||
|
||||
private bool m_listenControlAction;
|
||||
public bool ListenControlAction
|
||||
{
|
||||
@ -90,6 +91,9 @@ namespace AxibugEmuOnline.Client
|
||||
CommandDispatcher.Instance.RegistController(this);
|
||||
else
|
||||
CommandDispatcher.Instance.UnRegistController(this);
|
||||
|
||||
if(!value)
|
||||
ResetPulsInvoker();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -28,6 +28,6 @@ namespace AxibugEmuOnline.Client
|
||||
protected override void GetVirtualListDatas(Action<object> datas)
|
||||
{
|
||||
RomLib.FetchRomCount((roms) => datas.Invoke(roms));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,6 +119,12 @@ namespace AxibugEmuOnline.Client
|
||||
ListenControlAction = m_selected;
|
||||
}
|
||||
|
||||
protected override void OnCmdSelectItemLeft()
|
||||
{
|
||||
base.OnCmdSelectItemLeft();
|
||||
|
||||
OnCmdBack();
|
||||
}
|
||||
|
||||
protected override void OnSelectMenuChanged()
|
||||
{
|
||||
|
||||
@ -12,7 +12,7 @@ namespace AxibugEmuOnline.Client
|
||||
private RectTransform m_parent;
|
||||
|
||||
[SerializeField]
|
||||
private RectTransform m_selectArrow;
|
||||
private RectTransform m_selectArrow;
|
||||
[SerializeField]
|
||||
float ArrowOffset = 50;
|
||||
[SerializeField]
|
||||
@ -87,6 +87,7 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
void RollToIndex(int index, bool useAnim = false)
|
||||
{
|
||||
SyncRectToLaunchUI();
|
||||
Vector2 itemPos = itemGroup.GetItemAnchorePos(index);
|
||||
|
||||
Vector2 targetPos = itemGroup.transform.InverseTransformPoint(m_selectArrow.position);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user