Exemplo n.º 1
0
 public EnemyDeathEngine(IEntityFunctions entityFunctions, IEntityStreamConsumerFactory consumerFactory,
                         ITime time, WaitForSubmissionEnumerator waitForSubmission)
 {
     _entityFunctions   = entityFunctions;
     _consumerFactory   = consumerFactory;
     _time              = time;
     _waitForSubmission = waitForSubmission;
     _animations        = new FasterList <IEnumerator>();
     _consumer          = _consumerFactory.GenerateConsumer <DeathComponent>(
         ECSGroups.EnemiesGroup, "EnemyDeathEngine", 10);
 }
        public IEnumerator Tick()
        {
            _submissionWait = new WaitForSubmissionEnumerator(_functions, _entityFactory, entitiesDB);
            yield return(ReadyAllCoins());

            while (true)
            {
                yield return(_submissionWait);

                var(coins, coinViews, coinsCount) =
                    entitiesDB.QueryEntities <CoinComponent, CoinViewComponent>(CoinGroups.RecycledCoinsGroup);
                if (coinsCount == 0)
                {
                    continue;
                }

                // Advance spawn timer.
                var coinToSpawn = -1;
                for (var i = 0; i < coinsCount; i++)
                {
                    coins[i].TimeToRespawn -= _time.DeltaTime;
                    if (coins[i].TimeToRespawn > 0)
                    {
                        continue;
                    }

                    coinToSpawn = i;
                    break;
                }

                // Make sure there are available cells to drop a coin.
                var(cells, cellCount) = entitiesDB.QueryEntities <GridCellComponent>(GridGroups.GridWaterGroup);
                if (cellCount == 0 || _freeCellsFilter.filteredIndices.Count() == 0 || coinToSpawn < 0)
                {
                    continue;
                }

                // Spawn one coin if found (recycling it).
                var availableCells = _freeCellsFilter.filteredIndices;
                var selectedCell   = _random.NextUInt(0, (uint)availableCells.Count());
                var cell           = cells[availableCells.Get(selectedCell)];

                var coinView = coinViews[coinToSpawn];
                _functions.SwapEntityGroup <CoinEntityDescriptor>(coinView.ID, CoinGroups.SpawnedCoinsGroup);

                coinView.Transform.Position = new float3(cell.WorldCenter, 0);
            }
        }