Esempio n. 1
0
        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);
                }
            }
        }