protected override void BarrelMove(Tank tank)
        {
            // Advanced aiming
            // vars
            var player                 = ((MyGame)game).Player;
            var targetTank             = player.Tank;
            var targetVelocityWhenShot = targetTank.Velocity + TimeLeftToShoot * targetTank.Acceleration;

            if (targetVelocityWhenShot.sqrMagnitude >= player.MaxVelocity * player.MaxVelocity)
            {
                targetVelocityWhenShot = targetVelocityWhenShot.normalized * player.MaxVelocity;
            }

            var positionDelta = targetTank.Position - tank.Position;

            // quadratic equation
            var a     = targetVelocityWhenShot.Dot(targetVelocityWhenShot) - Bullet.Speed * Bullet.Speed;
            var b     = 2f * targetVelocityWhenShot.Dot(positionDelta);
            var c     = positionDelta.Dot(positionDelta);
            var delta = b * b - 4f * a * c;

            if (delta <= 0f)
            {
                return;
            }
            var t = 2f * c / (Mathf.Sqrt(delta) - b);

            if (t < 0f)
            {
                return;
            }

            // rotation
            var aimTarget       = targetTank.Position + t * targetVelocityWhenShot;
            var desiredRotation = -tank.rotation + Vec2.Rad2Deg((float)Math.Atan2(aimTarget.y - tank.Position.y, aimTarget.x - tank.Position.x));
            var deltaRotation   = desiredRotation - tank.Barrel.rotation;
            var shortestAngle   = Mathf.Clamp(deltaRotation - Mathf.Floor(deltaRotation / 360f) * 360f, 0.0f, 360f);

            if (shortestAngle > 180)
            {
                shortestAngle -= 360;
            }
            if (Math.Abs(tank.Barrel.rotation - desiredRotation) > 0.5)
            {
                tank.Barrel.rotation += shortestAngle * 0.10f;
            }

            attackIndicator.UpdateIndicator(TimeLeftToShoot);
        }
Exemplo n.º 2
0
        protected override void BarrelMove(Tank tank)
        {
            // Basic aiming
            var target          = ((MyGame)game).Player.Tank;
            var aimTarget       = target.Position;
            var desiredRotation = -tank.rotation + Vec2.Rad2Deg((float)Math.Atan2(aimTarget.y - tank.Position.y, aimTarget.x - tank.Position.x));
            var delta           = desiredRotation - tank.Barrel.rotation;
            var shortestAngle   = Mathf.Clamp(delta - Mathf.Floor(delta / 360f) * 360f, 0.0f, 360f);

            if (shortestAngle > 180)
            {
                shortestAngle -= 360;
            }
            if (Math.Abs(tank.Barrel.rotation - desiredRotation) > 0.5)
            {
                tank.Barrel.rotation += shortestAngle * 0.10f;
            }

            attackIndicator.UpdateIndicator(TimeLeftToShoot);
        }