Example #1
0
        private void LaunchPlane(Plane plane, IReadOnlyList <AirportInfo> visibleAirports)
        {
            var centerWorld = GameMaster.Instance.MainCamera.transform.position;
            var center      = WorldCoordinateHelper.WorldToLonLat(centerWorld);

            var cornerWorld = GameMaster.Instance.MainCamera.Camera.ViewportToWorldPoint(Vector3.one);

            var radius = Vector2.Distance(centerWorld, cornerWorld);

            var flight = _flightProvider.CreateFlight(visibleAirports, center, radius);

            plane.Fly(flight);
        }
        //TODO Replace with spherical calculations
        private FlightInfo CreateTakeoffFlight(IReadOnlyList <AirportInfo> availableAirports, LonLat viewCenter,
                                               float radius)
        {
            var airport = availableAirports.PickRandom();
            var dir     = GetTakeoffDirection(airport);

            var startPoint         = WorldCoordinateHelper.LonLatToWorld(airport.LonLat);
            var turnPoint          = startPoint + dir * TakeoffDist;
            var turnPointSpherical = WorldCoordinateHelper.WorldToLonLat(turnPoint);

            var endPoint = WorldCoordinateHelper.LonLatToWorld(viewCenter) +
                           Random.insideUnitCircle.normalized * (Settings.SafeDistanceMultiplier * radius);
            var endPointSpherical = WorldCoordinateHelper.WorldToLonLat(endPoint);

            return(new FlightInfo(new[] { airport.LonLat, turnPointSpherical, endPointSpherical }, true, false));
        }
Example #3
0
    public void Fly(FlightInfo flightInfo)
    {
        RandomizeValues();

        var waypoints = flightInfo.Points.Select(lat => (Vector3)WorldCoordinateHelper.LonLatToWorld(lat));

        transform.position = waypoints.First();

        var flyTween = transform
                       .DOLocalPath(waypoints.Skip(1).ToArray(), _speed,
                                    pathMode: PathMode.TopDown2D, pathType: PathType.CatmullRom)
                       .SetSpeedBased()
                       .SetEase(Ease.Linear)
                       .SetLookAt(0.01f)
                       .OnComplete(() =>
                                   this.WaitAndFire(() => OnFlightFinished?.Invoke(), _particleSystem.main.startLifetime.constant));

        flyTween.OnStart(() =>
        {
            if (flightInfo.EndsOnGround)
            {
                var duration = flyTween.Duration();

                _spriteRenderer.transform
                .DOScale(_targetSize / 20, LandingDuration)
                .SetEase(Ease.InQuart)
                .SetDelay(duration - LandingDuration);
            }
        });

        if (flightInfo.StartsOnGround)
        {
            _spriteRenderer.transform.localScale = Vector3.zero;
            _spriteRenderer.transform
            .DOScale(_targetSize, LandingDuration)
            .SetEase(Ease.OutCubic)
            ;
        }
    }
        private FlightInfo CreatePassingFlight(IReadOnlyList <AirportInfo> availableAirports, LonLat viewCenter,
                                               float radius)
        {
            var center     = WorldCoordinateHelper.LonLatToWorld(viewCenter);
            var startPoint = center + Random.insideUnitCircle.normalized * (Settings.SafeDistanceMultiplier * radius);
            var dir        = (center - startPoint).normalized;
            var angle      = Mathf.Atan2(dir.y, dir.x);

            Vector2?turnPoint = null;
            Vector2 endPoint;


            if (Random.Range(0, 1f) < Settings.PassingTurnProbability)
            {
                turnPoint = center + Random.insideUnitCircle * (0.3f * radius);
                const float halfPi = Mathf.PI / 2;
                endPoint = center + GetRandomVectorOnUnitCircle(angle - halfPi, angle + halfPi) *
                           (Settings.SafeDistanceMultiplier * radius);
            }
            else
            {
                const float deg30 = Mathf.Rad2Deg * 30;
                endPoint = center + GetRandomVectorOnUnitCircle(angle - deg30, angle + deg30) *
                           (Settings.SafeDistanceMultiplier * radius);
            }

            var startPointSpherical = WorldCoordinateHelper.WorldToLonLat(startPoint);
            var turnPointSpherical  =
                turnPoint.HasValue ? WorldCoordinateHelper.WorldToLonLat(turnPoint.Value) : (LonLat?)null;
            var endPointSpherical = WorldCoordinateHelper.WorldToLonLat(endPoint);

            var points = turnPointSpherical.HasValue
                                ? new[] { startPointSpherical, turnPointSpherical.Value, endPointSpherical }
                                : new[] { startPointSpherical, endPointSpherical };

            return(new FlightInfo(points));
        }