public virtual void OnUpdate() { // Ensures physics won't kick in while paused. if (State == GameState.Paused) { GamePool.UpdatePoolForPausedGame(); } if (State != GameState.Running) { return; } // Increase level every 30 seconds. _totalGameTime += FrameTime.Current; Hud.CurrentHud.SetStage((int)_totalGameTime / 30 + 1); // Go Game Over if player destroyed. if (_player.IsAlive == false) { // Avoid counting scores. State = GameState.Paused; if (_gameOverTime == DateTime.MinValue) { _gameOverTime = DateTime.Now; Mouse.ShowCursor(); Hud.CurrentHud.ShowGameOverDialog(); } } // Handle dynamic spawning of tunnels, doors and lights (does not handle tunnel movement). _levelElements.UpdateGeometry(); // Check Key input and update player speed. if (_player.Exists) { _player.CheckCoolDown(); _player.UpdateSpeed(); // Rotation while moving makes the game more dynamic. // Might be explained in an advanced tutorial. _player.UpdateRotation(); } // Update position of game objects including player. GamePool.UpdatePool(); Hud.CurrentHud.SetScore(_gameData.Score); // Add frame time and check if greater than or equal timer. _spawnTimer += FrameTime.Current; if (_spawnTimer >= SPAWN_EVERY_SECONDS) { // Reset spawn timer. _spawnTimer = 0; int waveType = Rand.NextInt(3); int enemyType = Rand.NextInt(3); // Increase speed for each difficulty level. Vec3 waveSpeed = new Vec3(0f, -11f - (Hud.CurrentHud.Stage * 2), 0f); if ((Enemy.WaveType)waveType == Enemy.WaveType.VerticalLine) { Enemy.SpawnWave(new Vec3(65, 660, 79), enemyType, Enemy.WaveType.VerticalLine, waveSpeed); } else if ((Enemy.WaveType)waveType == Enemy.WaveType.HorizontalLine) { var waveOffset = Rand.NextInt(3); Enemy.SpawnWave(new Vec3(65, 664, 72 + waveOffset), enemyType, Enemy.WaveType.HorizontalLine, waveSpeed); Enemy.SpawnWave(new Vec3(65, 664, 64 + waveOffset), enemyType, Enemy.WaveType.HorizontalLine, waveSpeed); } else if ((Enemy.WaveType)waveType == Enemy.WaveType.Diagonal) { Enemy.SpawnWave(new Vec3(65, 660, 79), enemyType, Enemy.WaveType.Diagonal, waveSpeed); } } }