Beispiel #1
0
    private void GenerateCoins()
    {
        float coinRadius        = _factory.CoinRadius();
        int   firstNum          = 0;
        int   lastNum           = 0;
        float deltaPlatformCoin = 0.2f;

        _allObjects.Sort(CompareByTransformHeight);

        foreach (CoinInterval coinInterval in _data.CoinIntervals)
        {
            // Find free space intervals between
            List <float[]> rawIntervals = new List <float[]>();
            firstNum = lastNum;
            for (int i = firstNum; (_allObjects[i].transform.position.y < coinInterval.IntervalEnd) && (i < _allObjects.Count - 1); i++)
            {
                if (_allObjects[i + 1].transform.position.y - _allObjects[i].transform.position.y - _platformSize.y - 2 * deltaPlatformCoin > coinRadius * 2)
                {
                    rawIntervals.Add(new float[] { _allObjects[i].transform.position.y + _platformSize.y / 2 + deltaPlatformCoin,
                                                   _allObjects[i + 1].transform.position.y - _platformSize.y / 2 - deltaPlatformCoin });
                }

                lastNum++;
            }

            // Find list of approximately equal space intervals between platforms
            List <float[]> equalIntervals = new List <float[]>();
            foreach (float[] interval in rawIntervals)
            {
                double n = Math.Round((interval[1] - interval[0]) / coinRadius / 2);
                float  delta = (interval[1] - interval[0]) / (float)n;
                float  start = interval[0], end;
                for (int i = 0; i < n; ++i)
                {
                    end = start + delta;
                    equalIntervals.Add(new float[] { start, end });
                    start = end;
                }
            }

            // Generate coin in random equal space interval
            if (coinInterval.Number > equalIntervals.Count)
            {
                Debug.Log($"Wrong number of coins");
            }

            int currentMaxNum = equalIntervals.Count;


            for (int i = 0; i < coinInterval.Number; ++i)
            {
                int num = Random.Range(0, currentMaxNum);

                GameObject coin     = _factory.GetCoin();
                Vector3    position = new Vector3(
                    Random.Range(coinRadius, _lvlWidth - coinRadius),
                    Random.Range(equalIntervals[num][0] + coinRadius, equalIntervals[num][1] - coinRadius));
                coin.transform.position = position;

                currentMaxNum--;
                equalIntervals.RemoveAt(num);
            }
        }
    }