Ejemplo n.º 1
0
        /// <summary>
        /// 解码参考编码
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List <SyncedData> Decode(byte[] data)
        {
            List <SyncedData> pool = SyncedData.poolList.GetNew();

            pool.Clear();
            int i    = 0;
            int tick = BitConverter.ToInt32(data, i);

            i += 4;
            byte ownerID          = data[i++];
            byte dropFromPlayerId = data[i++];
            bool dropPlayer       = data[i++] == 1;

            //int num2 = tick;
            while (i < data.Length)
            {
                SyncedData syncedData = SyncedData.pool.GetNew();
                syncedData.Init(ownerID, tick--);//这里不理解为啥要tick--
                syncedData.inputData.Deserialize(data, ref i);
                pool.Add(syncedData);
            }
            if (pool.Count > 0)
            {
                pool[0].dropPlayer       = dropPlayer;
                pool[0].dropFromPlayerId = dropFromPlayerId;
            }
            return(pool);
        }
Ejemplo n.º 2
0
        public static List <SyncedData> Decode(byte[] data)
        {
            List <SyncedData> @new = poolList.GetNew();

            @new.Clear();
            int i   = 0;
            int num = BitConverter.ToInt32(data, i);

            i += 4;
            byte ownerID = data[i++];
            byte b       = data[i++];
            bool flag    = data[i++] == 1;
            int  num2    = num;

            while (i < data.Length)
            {
                SyncedData new2 = SyncedData.pool.GetNew();
                new2.Init(ownerID, num2--);
                new2.inputData.Deserialize(data, ref i);
                @new.Add(new2);
            }
            bool flag2 = @new.Count > 0;

            if (flag2)
            {
                @new[0].dropPlayer       = flag;
                @new[0].dropFromPlayerId = b;
            }
            return(@new);
        }
Ejemplo n.º 3
0
        private SyncedData UpdateData()
        {
            bool       flag = this.replayMode == ReplayMode.LOAD_REPLAY;
            SyncedData result;

            if (flag)             // 加载回放模式
            {
                result = null;
            }
            else // 非加载回放模式
            {
                SyncedData @new = SyncedData.pool.GetNew();                 // 从池中获取
                @new.Init(this.localPlayer.ID, this.ticks);
                this.GetLocalData(@new.inputData); // 把玩家操作数据放入SyncedData实例中
                this.localPlayer.AddData(@new);    // 把SyncedData实例放入本地玩家的操作数据字典中

                bool flag2 = this.communicator != null;
                if (flag2)                                                                                                                   // 有通信器
                {
                    this.localPlayer.GetSendData(this.ticks, this._syncedDataCacheUpdateData);                                               // 把最新的操作数据放入_syncedDataCacheUpdateData中
                    this.communicator.OpRaiseEvent(199, SyncedData.Encode(this._syncedDataCacheUpdateData), true, this.auxActivePlayersIds); // 发送操作数据
                }
                result = @new;
            }
            return(result);
        }
        // 如果不是录像模式;获取本地玩家的输入操作,添加到本地玩家的当前帧同步数据;发送本地玩家操作给其他玩家
        private SyncedData UpdateData()
        {
            bool       flag = this.replayMode == ReplayMode.LOAD_REPLAY;
            SyncedData result;

            if (flag)
            {
                result = null;
            }
            else
            {
                // 获取本地玩家的输入操作,添加到本地玩家的当前帧同步数据
                SyncedData @new = SyncedData.pool.GetNew();
                @new.Init(this.localPlayer.ID, this.ticks);
                this.GetLocalData(@new.inputData);
                this.localPlayer.AddData(@new);
                bool flag2 = this.communicator != null;
                if (flag2)
                {
                    // 发送本地玩家操作给其他玩家
                    this.localPlayer.GetSendData(this.ticks, this._syncedDataCacheUpdateData);
                    // 199
                    this.communicator.OpRaiseEvent(SEND_CODE, SyncedData.Encode(this._syncedDataCacheUpdateData), true, this.auxActivePlayersIds);
                }
                result = @new;
            }
            return(result);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 收集本地玩家的输入,并通过服务器发送给其他玩家 OnSyncInput在这调用
        /// </summary>
        /// <returns></returns>
        private SyncedData UpdateData()
        {
            SyncedData result;

            if (this.replayMode == ReplayMode.LOAD_REPLAY)
            {
                result = null;
            }
            else
            {
                SyncedData syncedData = SyncedData.pool.GetNew();
                syncedData.Init(this.localPlayer.ID, this.ticks); //本地玩家ID来构造一个空数据包,等待输入数据填充
                this.GetLocalData(syncedData.inputData);          //TrueSyncManager.GetLocalData, 调用OnSyncedInput();获取本地玩家输入
                this.localPlayer.AddData(syncedData);             //本地数据直接塞给本地玩家(controls key:ticks value:syncedData 存储玩家每个tick的数据),下面还需要把本地数据发送给远端
                if (this.communicator != null)
                {
                    //因为_syncedDataCacheUpdateData只有一个,所以只获取了一个SyncedData
                    this.localPlayer.GetSendData(this.ticks, this._syncedDataCacheUpdateData);//从TSplayer的controls里取数据
                    //把本地玩家的输入数据发给远端玩家
                    this.communicator.OpRaiseEvent(SEND_CODE, SyncedData.Encode(this._syncedDataCacheUpdateData), true, this.auxActivePlayersIds);
                }
                result = syncedData;
            }
            return(result);
        }
Ejemplo n.º 6
0
        public SyncedData clone()
        {
            SyncedData @new = SyncedData.pool.GetNew();

            @new.Init(this.inputData.ownerID, this.tick);
            @new.inputData.CopyFrom(this.inputData);
            return(@new);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 收集本地输入,通过服务器发送给其他玩家
        /// </summary>
        /// <returns></returns>
        private SyncedData UpdateData()
        {
            Debug.Log("UpdateData");
            SyncedData result;

            if (replayMode == ReplayMode.LOAD_REPLAY)
            {
                result = null;
            }
            else
            {
                SyncedData @new = SyncedData.pool.GetNew();
                @new.Init(localPlayer.ID, ticks);
                GetLocalData(@new.inputData); //调用OnSyncedInput();输入数据给到@new.inputData里面
                localPlayer.AddData(@new);    //数据塞给TSPlayer的controls
                if (communicator != null)
                {
                    localPlayer.GetSendData(ticks, _syncedDataCacheUpdateData);                                                     //从TSplayer的controls里取数据
                    communicator.OpRaiseEvent(SEND_CODE, SyncedData.Encode(_syncedDataCacheUpdateData), true, auxActivePlayersIds); //将自己的输入数据发给其他玩家
                }
                result = @new;
            }
            return(result);
        }