Waves
Waves¶
Ik ga ervoor zorgen dat er meerdere soorten enemies in de waves spawnen. Dit doe ik zodat het spel moeilijker wordt.
Begin van het spel¶
Als het spel begint moet ik een wave spawnen. Ik bereken de value van deze wave en die gebruik ik als kosten voor het spawnen van de enemies. Elke enemy heeft zijn eigen kosten. Als alle kosten gebruikt zijn is het spawnen voorbij.
var waveBudget = currentWave * currentWave * extraEnemiesPerWave * difficultyMultiplier;
var affordableEnemies = new Stack<KeyValuePair<int, Type>>(enemiesWithCosts);
for (int i = 0; i < waveBudget;)
{
while (affordableEnemies.TryPeek(out var topEnemy) && waveBudget < topEnemy.Key)
{
affordableEnemies.Pop();
}
enemiesSpawned ++;
var chosenEnemy = App.Random.Next(affordableEnemies.Count());
var enemy = affordableEnemies.ElementAt(chosenEnemy);
waveBudget -= enemy.Key;
var obj = (BaseEntity?)Activator.CreateInstance(enemy.Value);
SpawnEnemy(obj!);
}
Enemy spawnen¶
In de waves moeten de enemies een random position hebben en dan daar spawnen.
public void SpawnEnemy(BaseEntity entity)
{
var entityRadius = (int)MathF.Round(entity.Size.X);
var playerPosition = gameState.Player.Position;
do {
entity.Position = new Vector2(
App.Random.Next(entityRadius, App.Screen.X - entityRadius),
App.Random.Next(entityRadius, App.Screen.Y - entityRadius)
);
} while (Vector2.Distance(playerPosition, entity.Position) < minDistanceFromPlayer);
gameState.Add(entity);
enemiesRemaining++;
}
Einde spel¶
Als het wavenummer te hoog wordt spawned er eerst een boss. As de boss versagen is eindigt het spel. Ik gebruik een Enum om aan te geven welke staat het spel momenteel in is.
if (currentWave == bossWaveNumber && !bossEnemySpawned)
{
SpawnEnemy(new BossEnemy());
bossEnemySpawned = true;
return;
}
Daarna publish ik het event met de eventbus. Hierdoor kunnen andere systemen hier gebruik van maken.
gameProgress = GameProgressEnum.Victory;
events.Publish(new GameEndedEvent(this, true));
nextState = App.StateManager.GetState<WinOrLoseMenuState>();
Animate(AnimationState.MovingOffscreenInactive);
Bronnen¶
- C# documentation. (z.d.) learn.microsoft.com.
Laatst geraadpleegd op 21 mei 2024, van https://learn.microsoft.com/en-uk/dotnet/csharp/ - Monogame documentation. (z.d.) monogame.net.
Laatst geraadpleegd op 21 mei 2024, van https://monogame.net/articles
Laatst geüpdatet:
June 10, 2024
Gecreëerd: May 21, 2024
Gecreëerd: May 21, 2024