예제 #1
0
        public override void Update(GameTime gameTime)
        {
            inQueue = new List <NetIncomingMessage>();
            var msgCount = client.ReadMessages(inQueue);

            outQueue = new List <NetOutgoingMessage>();

            if (HelperFunction.IsKeyDown(Keys.Escape))
            {
                client.Disconnect("Smell ya later");
                CONTENT_MANAGER.GameInstance.Exit();
            }

            if (!Players.ContainsKey(ID) && HelperFunction.IsKeyPress(Keys.R))
            {
                outQueue.Add(NetCommand.WriteCommand(ID, Command.CreatePlayer, 112f, 112f));
            }

            foreach (var player in Players.Values)
            {
                player.Update(gameTime);
            }

            foreach (var msg in inQueue)
            {
                switch (msg.MessageType)
                {
                case NetIncomingMessageType.DiscoveryResponse:
                    Console.WriteLine("Found server at " + msg.SenderEndPoint + " name: " + msg.ReadString());
                    client.Connect(msg.SenderEndPoint);
                    break;

                case NetIncomingMessageType.Data:
                {
                    NetCommand netcmd = NetCommand.ReadCommand(msg);

                    switch (netcmd.Command)
                    {
                    case Command.CreatePlayer:
                        Console.WriteLine(netcmd);
                        SpawnPlayer(netcmd);
                        break;

                    case Command.DestroyPlayer:
                        if (Players.ContainsKey(netcmd.LL))
                        {
                            world.Remove(Players[netcmd.LL].collision);
                            Players.Remove(netcmd.LL);
                        }
                        break;

                    case Command.QuerryPlayerPosition:
                        AnswerPosition();
                        break;

                    case Command.ChangePlayerColor:
                    case Command.MovePlayer:
                    case Command.RotatePlayer:
                    case Command.StopPlayer:
                    case Command.CreateBullet:
                    case Command.MoveBullet:
                    case Command.DestroyBullet:
                        Players[netcmd.ID].ExecuteCommand(netcmd);
                        break;
                    }
                }
                break;
                }
            }

            foreach (var msg in outQueue)
            {
                client.SendMessage(msg, NetDeliveryMethod.ReliableOrdered);
            }
            client.FlushSendQueue();

            client.Recycle(inQueue);

            canvas.Update(gameTime, CONTENT_MANAGER.CurrentInputState, CONTENT_MANAGER.LastInputState);
        }