Beispiel #1
0
        public void SendCommand()
        {
            Command cmd = new Command();

            cmd.input    = CollectCommandInput();   // 获取指令
            cmd.sequence = KeyFrameNumber;

            ProtocolBytes proto = new ProtocolBytes();

            proto.AddString("SyncCommand");
            proto.AddUint(cmd.sequence);
            proto.AddFix(cmd.input.x);
            proto.AddFix(cmd.input.z);

            NetMgr.srvConn.Send(proto);
        }
Beispiel #2
0
    //更新信息
    public void MsgSyncCommand(Player player, ProtocolBase protoBase)
    {
        //获取数值
        int           start          = 0;
        ProtocolBytes protocol       = (ProtocolBytes)protoBase;
        string        protoName      = protocol.GetString(start, ref start);
        uint          KeyFrameNumber = protocol.GetUint(start, ref start);
        Fix64         x   = protocol.GetFix(start, ref start);
        Fix64         z   = protocol.GetFix(start, ref start);
        Command       cmd = new Command();

        cmd.input.x = x;
        cmd.input.z = z;
        //多线程处理消息,此时需要防止竞争
        lock (ServNet.instance.command_list)
        {
            //使用Enqueue的话,我们假定了接收到的包都是顺序的,并且不会丢包;若出现这种情况怎么办?
            ServNet.instance.command_list[player.id].Enqueue(cmd);
            //在这里判断是否收到了所有玩家下一关键帧的控制信息
            foreach (var item in ServNet.instance.command_list)
            {
                //有玩家的关键帧还未送达
                if (item.Value.Count == 0)
                {
                    return;
                }
            }
            //所有玩家的关键帧都送达,所有玩家的控制消息队列都出列一项,并广播给所有客户
            //广播
            ProtocolBytes protocolRet = new ProtocolBytes();
            protocolRet.AddString("SyncCommand");
            protocolRet.AddUint(KeyFrameNumber + 5);  //K1
            protocolRet.AddUint(KeyFrameNumber + 10); //K2
            protocolRet.AddInt(ServNet.instance.command_list.Count);
            foreach (var item in ServNet.instance.command_list)
            {
                protocolRet.AddString(item.Key);

                Console.WriteLine("item.Key " + item.Key);

                Command _cmd = item.Value.Dequeue();
                protocolRet.AddFix(_cmd.input.x);
                protocolRet.AddFix(_cmd.input.z);
            }
            ServNet.instance.Broadcast(protocolRet);
        }
    }