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); } }