示例#1
0
    public void SpawnNumber(double content, Vector3 location)
    {
        _accumulator += content;

        if (!_poolController.ObjectsAvailable() ||
            !(Time.time - _lastSpawn > _spawnDelay) ||
            _accumulator < 11)
        {
            return;
        }

        var instance = _poolController.Spawn() as FloatingNumber;

        if (!instance)
        {
            throw new NullReferenceException();
        }

        Vector2 screenPosition = Camera.main.WorldToScreenPoint(
            new Vector3(
                location.x + Random.Range(-.2f, .2f),
                0f,
                location.z + Random.Range(-.2f, .2f)
                ));

        instance.transform.SetParent(_canvas.transform, false);
        instance.transform.position   = screenPosition;
        instance.transform.localScale = new Vector3(1, 1, 1);
        instance.SetNumber(_accumulator);
        instance.StartPlayback();
        _accumulator = 0;
        _lastSpawn   = Time.time;
        PoolCount    = _poolController.ObjectCount();
    }
示例#2
0
    private void SpawnRandomFood()
    {
        var index   = Random.Range(0, m_foodList.Count);
        var foodObj = m_foodList[index];

        m_randomRot.y = Random.Range(0.0f, 360.0f);
        m_randomRot.z = Random.Range(0.0f, 360.0f);
        var food = m_objectPool.Spawn(foodObj.gameObject, transform.position, Quaternion.identity);

        food.transform.eulerAngles = m_randomRot;
    }
示例#3
0
    public void Initialize()
    {
        _edgeFlames   = new List <GridItem>();
        _activeFlames = new List <GridItem>();

        _flamePrefab = Resources.Load <FlameController>("Prefabs/Flame");
        Vector3 floorSize = gameObject.transform.localScale;
        float   height    = floorSize.z;
        float   width     = floorSize.x;
        Vector3 itemSize  = new Vector3(width / _columns, 1.1f, height / _rows);

        _flamePrefab.transform.localScale = itemSize;


        _flamePool = GameMaster.InstantiatePool(_firePoolSize, _flamePrefab, "FlamePool");


        _fireGrid = new GridController(_rows, _columns, _payloadDepth, gameObject);

        _fireGrid.InitVariable("intensity", 0d, item =>
        {
            var g           = new Gradient();
            var gColor      = new GradientColorKey[4];
            gColor[0].color = Color.white;
            gColor[0].time  = 0f;
            gColor[1].color = Color.gray;
            gColor[1].time  = 0.25f;
            gColor[2].color = Color.yellow;
            gColor[2].time  = 0.5f;
            gColor[3].color = Color.red;
            gColor[3].time  = 1f;
            var gAlpha      = new GradientAlphaKey[1];
            gAlpha[0].alpha = 1f;
            gAlpha[0].time  = 0f;
            g.SetKeys(gColor, gAlpha);

            var main = item.GetPayload <FlameController>(0)
                       .GetComponent <ParticleSystem>().main;

            main.startColor = g.Evaluate(
                (float)(item.GetVariable <double>("intensity") / (_maxFlameIntensity))
                );
        });

        _fireGrid.InitVariable <bool>("flammable", item =>
        {
            Vector3 pos = _fireGrid.GetPosition(item._gridCoords);

            var posLeft = new Vector3(
                pos.x + _fireGrid._itemWidth / 2,
                0.2f,
                pos.y
                );

            var posDown = new Vector3(
                pos.x,
                0.2f,
                pos.y + _fireGrid._itemHeight / 2
                );

            var rayLeft = new Ray(posLeft, Vector3.left);
            var rayDown = new Ray(posDown, Vector3.back);

            Debug.DrawRay(rayLeft.origin, rayLeft.direction * _fireGrid._itemWidth, Color.white, 30000);
            Debug.DrawRay(rayDown.origin, rayDown.direction * _fireGrid._itemHeight, Color.white, 30000);

            var flammable = !(Physics.Raycast(rayDown, _fireGrid._itemHeight) ||
                              Physics.Raycast(rayLeft, _fireGrid._itemWidth));
            return(flammable);
        });

        _fireGrid.InitVariable("onfire", false);


        foreach (Vector2 coords in _startingFlames)
        {
            FlameController flame = _flamePool.Spawn() as FlameController;
            if (!flame)
            {
                throw new Exception("Can't start a fire! Someone bring more matches!!");
            }
            var gridCoords = _fireGrid.GetPosition(coords);
            flame.transform.position = new Vector3(
                gridCoords.x,
                _verticalOffset,
                gridCoords.y
                );
            var cell = _fireGrid.GetGridItem(coords.x, coords.y);
            cell.SetPayload(flame, 0);
            cell.SetVariable("intensity", _startIntensity);
            cell.SetVariable("onfire", true);
            _activeFlames.Add(cell);
            _edgeFlames.Add(cell);
            _fireGrid.UpdateGridItem(cell._gridCoords, cell);
        }

        _tick = Time.time;

        var orgSpreadChange = _spreadChance;

        _spreadChance = 1f;

        for (int i = 0; i < _prewarm; i++)
        {
            Spread();
            Grow();
        }

        _spreadChance = orgSpreadChange;

        _levelManager.GameMaster.ResetUi();

        initialized = true;
    }
示例#4
0
    /// <summary>
    ///
    /// </summary>
    private void Spread()
    {
        int spreadCount = 0;

        _edgeFlames = new List <GridItem>();
        foreach (var item in _activeFlames)
        {
            bool add = false;
            foreach (var neighbour in item.GetNeighbours(_spreadDistance))
            {
                if (!neighbour.GetVariable <bool>("onfire"))
                {
                    add = true;
                }
            }
            if (add)
            {
                _edgeFlames.Add(item);
            }
            //limiting the number of flames we're even gonna look at for speed sake
            if (_edgeFlames.Count >= _spreadLimit * 2)
            {
                break;
            }
        }

        //shuffle those suckers
        int next = _edgeFlames.Count;

        while (next > 1)
        {
            next--;
            int      k = Random.Range(0, next + 1);
            GridItem f = _edgeFlames[k];
            _edgeFlames[k]    = _edgeFlames[next];
            _edgeFlames[next] = f;
        }
        _edgeFlames.Reverse();

        foreach (GridItem edgeItem in _edgeFlames)
        {
            if (edgeItem.GetVariable <double>("intensity") < _spreadIntensity)
            {
                continue;
            }
            List <GridItem> emptyNeighbours = new List <GridItem>();

            foreach (GridItem n in edgeItem.GetNeighbours(_spreadDistance))
            {
                if (!n.GetVariable <bool>("onfire") &&
                    n.GetVariable <bool>("flammable") &&
                    HasLineOfSight(n, edgeItem))
                {
                    emptyNeighbours.Add(n);
                }
            }

            foreach (GridItem neighbour in emptyNeighbours)
            {
                if (Random.value < 1 - _spreadChance)
                {
                    continue;
                }
                if (spreadCount >= _spreadLimit)
                {
                    break;
                }
                FlameController newFlame = _flamePool.Spawn() as FlameController;
                if (!newFlame)
                {
//                    _levelManager.GameMaster.OnDeath( );
                    return;
                }
                ;
                spreadCount++;
                newFlame.GetComponent <Collider>().enabled = false;
                var center   = _fireGrid.GetPosition(neighbour._gridCoords);
                var position = new Vector3(
                    center.x,
                    _verticalOffset,
                    center.y
                    );
//                Debug.Log("Setting new flame to " + neighbour._gridCoords);
//                Debug.Log("To position" +   position);
                newFlame.transform.position = position;
                newFlame.GetComponent <Collider>().enabled = true;

                neighbour.SetPayload(newFlame, 0);
                neighbour.SetVariable("intensity", 1d);
                neighbour.SetVariable("onfire", true);
                neighbour.SetVariable("verticalOffset", _verticalOffset);
                _fireGrid.UpdateGridItem(neighbour._gridCoords, neighbour);
                //TODO check if neighbour is actually an edge flame
                _activeFlames.Add(neighbour);
            }
        }
    }