Пример #1
0
    public void AddPlayerPositionMeasure(float lat, float lon)
    {
        PlayerPositionMeasure measure = new PlayerPositionMeasure()
        {
            lattitude = lat, longitude = lon, timestamp = DateTime.Now.Ticks
        };

        mouvementMeasures.Add(measure);
        RemoveUnusedPlayerPositionMeasures();
    }
Пример #2
0
    /// <summary>
    /// Return player speed in m/s (in real world)
    /// </summary>
    /// <returns></returns>
    private float PlayerCurrentSpeedFromMeasures()
    {
        float speed = 0;

        if (mouvementMeasures.Count > 1)
        {
            PlayerPositionMeasure oldestMeasure  = mouvementMeasures[0];
            PlayerPositionMeasure currentMeasure = mouvementMeasures[mouvementMeasures.Count - 1];
            double distanceInMeters = Tools.getDistanceFromLatLonInM(currentMeasure.lattitude, currentMeasure.longitude, oldestMeasure.lattitude, oldestMeasure.longitude);
            float  timeInSeconds    = Mathf.Abs((currentMeasure.timestamp - oldestMeasure.timestamp) * 1.0f / TimeSpan.TicksPerSecond);
            speed = (float)(distanceInMeters / timeInSeconds);
        }
        return(speed);
    }
Пример #3
0
    private PlayerPositionMeasure NextPositionEstimated()
    {
        PlayerPositionMeasure estimatedNextMeasure = null;

        if (mouvementMeasures.Count > 1)
        {
            // at least 2 measures available
            PlayerPositionMeasure lastMeasure = mouvementMeasures[mouvementMeasures.Count - 1];
            PlayerPositionMeasure oldMeasure  = mouvementMeasures[mouvementMeasures.Count - 2];
            estimatedNextMeasure = new PlayerPositionMeasure()
            {
                longitude = lastMeasure.longitude * 2 - oldMeasure.longitude,
                lattitude = lastMeasure.lattitude * 2 - oldMeasure.lattitude,
                timestamp = lastMeasure.timestamp * 2 - oldMeasure.timestamp
            };
        }
        else if (mouvementMeasures.Count == 1)
        {
            // only one measure available
            estimatedNextMeasure = mouvementMeasures[0];
        }
        return(estimatedNextMeasure);
    }
Пример #4
0
    // Update is called once per frame
    void Update()
    {
        if (MyLocationService.instance == null || editorMode || Application.platform != RuntimePlatform.Android)
        {
            // editor mode : player location depends on inputs
            float latStep = 0.001f * editorModePlayerSpeed;
            float lonStep = 0.001f * editorModePlayerSpeed;

            float newPlayerLat = playerLat;
            float newPlayerLon = playerLon;

            bool spacePressed      = Input.GetKeyDown(KeyCode.Space);
            bool leftArrowPressed  = Input.GetKeyDown(KeyCode.LeftArrow);
            bool rightArrowPressed = Input.GetKeyDown(KeyCode.RightArrow);
            bool upArrowPressed    = Input.GetKeyDown(KeyCode.UpArrow);
            bool downArrowPressed  = Input.GetKeyDown(KeyCode.DownArrow);

            bool newInput = spacePressed || leftArrowPressed || rightArrowPressed || upArrowPressed || downArrowPressed;

            if (leftArrowPressed)
            {
                newPlayerLon -= lonStep;
            }
            if (rightArrowPressed)
            {
                newPlayerLon += lonStep;
            }
            newPlayerLon = (newPlayerLon < -180) ? (newPlayerLon + 360) : ((newPlayerLon > 180) ? (newPlayerLon - 360) : newPlayerLon);
            if (upArrowPressed)
            {
                newPlayerLat += latStep;
            }
            if (downArrowPressed)
            {
                newPlayerLat -= latStep;
            }
            newPlayerLat = (newPlayerLat < -90) ? -90 : ((newPlayerLat > 90) ? 90 : newPlayerLat);

            if (newInput)
            {
                AddManualPlayerPositionMeasure(newPlayerLat, newPlayerLon);
                playerLat = newPlayerLat;
                playerLon = newPlayerLon;
            }

            playerPositionIsValid = true;
        }
        else if (MyLocationService.instance.locationServiceIsRunning)
        {
            // release mode : player location depends on GPS
            GeoPoint playerLocation = MyLocationService.instance.playerLocation;
            playerLon = playerLocation.lon_d;
            playerLat = playerLocation.lat_d;
            AddManualPlayerPositionMeasure(playerLat, playerLon);

            playerPositionIsValid = true;
        }

        if (playerPositionIsValid && mapGenerator.mapIsReady)
        {
            PlayerPositionMeasure playerPosition = GetLastMeasure();
            if (playerPosition != null)
            {
                Vector3 playerPositionInScene = mapGenerator.GetWorldPositionFromLatLon(playerPosition.lattitude, playerPosition.longitude);
                playerMouvTarget.position = playerPositionInScene + 2.5f * Vector3.up;
            }
        }
    }