Пример #1
0
    // Update is called once per frame
    void Update()
    {
        time     += Time.deltaTime;
        acumTime += Time.deltaTime;

        if (acumTime >= (1.0f / fps))
        {
            frame++;
            acumTime -= (1.0f / fps);
            Packet packet = PacketQueue.GetInstance().PollPacket();
            while (packet != null)
            {
                foreach (var gm in packet.Messages)
                {
                    handler.Handle(gm);
                }
                packet = PacketQueue.GetInstance().PollPacket();
            }

            foreach (var action in player.toSend)
            {
                outgoingMessages.Add(action);
            }
            player.toSend.Clear();

            foreach (var gm in outgoingMessages)
            {
                if (gm.isReliable())
                {
                    if (MessageType.PlayerInput.Equals(gm.type()))
                    {
                        rq.AddQueueWithOutTimeout((ReliableMessage)gm);
                    }
                    else
                    {
                        rq.AddQueueWithTimeout((ReliableMessage)gm, time);
                    }
                }
            }

            Dictionary <int, PlayerSnapshot> currentSnapshot = SnapshotHandler.GetInstance().getSnapshot(time);
            if (currentSnapshot != null)
            {
                SnapshotHandler.GetInstance().updatePlayer(currentSnapshot);
            }

            outgoingMessages.AddRange(rq.MessageToResend(time));
            Debug.Log("Outgoing messages size: " + outgoingMessages.Count);
            if (outgoingMessages.Count > 0)
            {
                Packet p     = new Packet(outgoingMessages);
                byte[] bytes = p.serialize();
                SendUdp(bytes);
                outgoingMessages.Clear();
            }
        }
    }
Пример #2
0
    private void handleWorldSnapshot(WorldSnapshotMessage wm)
    {
        float time = wm._playerSnapshots[0]._TimeStamp;
        Dictionary <int, PlayerSnapshot> worldSnap = new Dictionary <int, PlayerSnapshot>();


        foreach (PlayerSnapshot wmPlayerSnapshot in wm._playerSnapshots)
        {
            worldSnap.Add(wmPlayerSnapshot.id, wmPlayerSnapshot);
        }

        SnapshotHandler.GetInstance().ReceiveSnapshot(worldSnap, time);
    }
Пример #3
0
    // Update is called once per frame
    void Update()
    {
        time     += Time.deltaTime;
        acumTime += Time.deltaTime;

        if (Input.GetKey(KeyCode.W))
        {
            frameActions.Add(PlayerAction.MoveForward);
        }
        if (Input.GetKey(KeyCode.A))
        {
            frameActions.Add(PlayerAction.MoveLeft);
        }
        if (Input.GetKey(KeyCode.S))
        {
            frameActions.Add(PlayerAction.MoveBack);
        }
        if (Input.GetKey(KeyCode.D))
        {
            frameActions.Add(PlayerAction.MoveRight);
        }

        if (Input.GetMouseButtonDown(0))
        {
            Shoot();
            toSend.Add(new PlayerInputMessage(PlayerAction.Shoot, time, true));
        }

        if (acumTime >= (1.0f / GlobalSettings.Fps))
        {
            acumTime -= (1.0f / GlobalSettings.Fps);
            foreach (var action in frameActions)
            {
                PlayerInputMessage msg = new PlayerInputMessage(action, time, true);
                toSend.Add(msg);
                if (SnapshotHandler.GetInstance().prediction)
                {
                    actions.Enqueue(msg);
                    applyAction(action);
                }
            }
            toSend.Add(new RotationMessage(this.gameObject.transform.eulerAngles));
            frameActions.Clear();
        }

        camera.transform.position = this.gameObject.transform.position;
        camera.transform.rotation = this.gameObject.transform.rotation;
    }
Пример #4
0
    // Use this for initialization
    void Start()
    {
        player           = GameObject.Find("Player").GetComponent <Player>();
        player.name      = playerName;
        outgoingMessages = new List <GameMessage>();
        rq = new ReliableQueue(GlobalSettings.ReliableTimeout);
        rq.AddQueueWithTimeout(new ClientConnectMessage(playerName, time, true), 0);
        otherPlayers = new Dictionary <int, ServerPlayer>();
        handler      = new ClientMessageHandler(this);
        SnapshotHandler.GetInstance().otherPlayers = this.otherPlayers;
        SnapshotHandler.GetInstance().self         = this.player;
        SnapshotHandler.GetInstance().prediction   = this.prediction;
        Thread thread = new Thread(new ThreadStart(ThreadMethod));

        thread.Start();
    }