Пример #1
0
 private void PlayerUpdateHandler(Interfaces.Player player)
 {
     using (_logger.BeginScope(nameof(PlayerUpdateHandler)))
     {
         _logger.LogDebug(LoggingEvents.PlayerReceived, $"Player received {player.ID}");
     }
 }
Пример #2
0
 private void ProcessInput(Interfaces.Player player)
 {
     using (_logger.BeginScope(nameof(ProcessInput)))
     {
         player.Fire1 = _random.NextDouble() > 0.8;
         player.Top   = true; // _random.NextDouble() > 0.1;
         if (player.Top)
         {
             player.Left  = player.Left ? _random.NextDouble() > 0.02 : _random.NextDouble() > 0.98;
             player.Right = !player.Left;
         }
         else
         {
             player.Left = player.Right = false;
         }
     }
 }
Пример #3
0
        public async Task Play()
        {
            using (_logger.BeginScope(nameof(Play)))
            {
                _stopwatch.Start();
                var connection = new HubConnectionBuilder()
                                 .WithUrl(_options.Url)
                                 .AddMessagePackProtocol()
                                 .Build();

                connection.On <Constant>("Constants", ConstantsUpdateHandler);
                connection.On <string, PlayerMetadata>("PlayerMetadataUpdate", PlayerMetadataUpdateUpdateHandler);
                connection.On <Interfaces.Player>("Update", PlayerUpdateHandler);
                connection.On <Shot>("Fire", ShotUpdateHandler);

                _logger.LogInformation(LoggingEvents.Connecting, $"Connecting to {_options.Url}...");
                await connection.StartAsync(_cancellationTokenSource.Token);

                _logger.LogInformation(LoggingEvents.Connected, "Connected!");

                while (_playerMetadata == null)
                {
                    _logger.LogInformation(LoggingEvents.WaitingMetadata, "Waiting for player metadata");
                    await Task.Delay(500, _cancellationTokenSource.Token);
                }

                if (_playerMetadata == null)
                {
                    _logger.LogError(LoggingEvents.WaitingMetadataCancelled, "Waiting for metadata has been cancelled.");
                    return;
                }

                var animationUpdate = _stopwatch.Elapsed.Ticks;
                _playerMetadata.Player.Time = animationUpdate / (double)TimeSpan.TicksPerMillisecond;

                var previouslySubmittedPlayer = new Interfaces.Player
                {
                    X = _playerMetadata.Player.X,
                    Y = _playerMetadata.Player.Y
                };

                while (!_cancellationTokenSource.IsCancellationRequested)
                {
                    var timestamp = _stopwatch.Elapsed.Ticks;
                    var delta     = (timestamp - animationUpdate) / (double)TimeSpan.TicksPerSecond;

                    var player = _playerMetadata.Player;
                    if (player.Animation != null)
                    {
                        player.AnimationTiming -= delta * _constant.Animation.ExplosionAnimationDuration;
                        if (player.AnimationTiming <= 0)
                        {
                            player.Rotation        = Math.PI * 3 / 2;
                            player.Speed           = 0;
                            player.Animation       = null;
                            player.AnimationTiming = 0;
                        }
                    }
                    else
                    {
                        var previousPlayer = new Interfaces.Player
                        {
                            Left  = player.Left,
                            Right = player.Right,
                            Top   = player.Top,
                            Fire1 = player.Fire1,
                            X     = player.X,
                            Y     = player.Y
                        };

                        UpdatePlayer(delta, player);
                        ProcessInput(player);

                        _logger.LogDebug($"Input state previousPlayer: Top: {previousPlayer.Top}, Left: {previousPlayer.Left}, Right: {previousPlayer.Right}, Fire1: {previousPlayer.Fire1}");
                        _logger.LogDebug($"Input state player:         Top: {player.Top}, Left: {player.Left}, Right: {player.Right}, Fire1: {player.Fire1}");
                        _logger.LogDebug($"Input changes:              Top: {previousPlayer.Top != player.Top}, Left: {previousPlayer.Left != player.Left}, Right: {previousPlayer.Right != player.Right}, Fire1: {previousPlayer.Fire1 != player.Fire1}");

                        var deltaX   = previousPlayer.X - player.X;
                        var deltaY   = previousPlayer.Y - player.Y;
                        var distance = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
                        _logger.LogDebug($"distance change: {distance}");

                        var deltaSubmitX        = previouslySubmittedPlayer.X - player.X;
                        var deltaSubmitY        = previouslySubmittedPlayer.Y - player.Y;
                        var deltaSubmitDistance = Math.Sqrt(deltaSubmitX * deltaSubmitX + deltaSubmitY * deltaSubmitY);
                        _logger.LogDebug($"previously submitted distance change: {deltaSubmitDistance}");

                        if (previousPlayer.Left != player.Left ||
                            previousPlayer.Right != player.Right ||
                            previousPlayer.Top != player.Top ||
                            previousPlayer.Fire1 != player.Fire1 ||
                            deltaSubmitDistance > 50 ||
                            (timestamp - previouslySubmittedPlayer.Time) / (double)TimeSpan.TicksPerMillisecond > _constant.Network.SendUpdateFrequency)
                        {
                            _logger.LogInformation($"Send Time: {player.Time} (delta: {(timestamp - previouslySubmittedPlayer.Time) / (double)TimeSpan.TicksPerMillisecond})");
                            player.Time = timestamp / (double)TimeSpan.TicksPerMillisecond;

                            await connection.InvokeAsync(
                                "Update",
                                player,
                                _cancellationTokenSource.Token);

                            previouslySubmittedPlayer.X    = player.X;
                            previouslySubmittedPlayer.Y    = player.Y;
                            previouslySubmittedPlayer.Time = timestamp;
                        }
                    }

                    animationUpdate = timestamp;
                    await Task.Delay(25, _cancellationTokenSource.Token);
                }
            }
        }
Пример #4
0
        private void UpdatePlayer(double delta, Interfaces.Player player)
        {
            using (_logger.BeginScope(nameof(UpdatePlayer)))
            {
                _logger.LogDebug($"Before player.X: {player.X}");
                _logger.LogDebug($"Before player.Y: {player.Y}");
                _logger.LogDebug($"Before player.Speed: {player.Speed}");
                _logger.LogDebug($"Before player.Rotation: {player.Rotation}");

                if (player.Left)
                {
                    player.Rotation -= delta * _constant.Movement.TurnRate;
                    if (player.Rotation < 0)
                    {
                        player.Rotation += 2 * Math.PI;
                    }
                }
                if (player.Right)
                {
                    player.Rotation += delta * _constant.Movement.TurnRate;
                    if (player.Rotation > 2 * Math.PI)
                    {
                        player.Rotation -= 2 * Math.PI;
                    }
                }
                if (player.Top)
                {
                    player.Speed += delta * _constant.Movement.AccelerationRate;
                    if (player.Speed > _constant.Movement.MaxSpeedPerSecond)
                    {
                        player.Speed = _constant.Movement.MaxSpeedPerSecond;
                    }
                }
                else if (player.Speed > 0)
                {
                    player.Speed -= delta * _constant.Movement.DeAccelerationRate;
                    if (player.Speed < 1)
                    {
                        player.Speed = 0;
                    }
                }
                if (player.Bottom)
                {
                    player.Speed -= delta * _constant.Movement.BrakeRate;
                    if (player.Speed < 0)
                    {
                        player.Speed = 0;
                    }
                }

                var deltaX = delta * player.Speed * Math.Cos(player.Rotation);
                var deltaY = delta * player.Speed * Math.Sin(player.Rotation);

                _logger.LogDebug($"delta:  {delta}");
                _logger.LogDebug($"deltaX: {deltaX}");
                _logger.LogDebug($"deltaY: {deltaY}");

                player.X += deltaX;
                player.Y += deltaY;

                _logger.LogDebug($"After player.X: {player.X}");
                _logger.LogDebug($"After player.Y: {player.Y}");
                _logger.LogDebug($"After player.Speed: {player.Speed}");
                _logger.LogDebug($"After player.Rotation: {player.Rotation}");
            }
        }