示例#1
0
        public void Update(GameTime gameTime)
        {
            if (_bindings.JustPressed(Bindings.Restart))
            {
                if (_winnerIsYou)
                {
                    _screens.TransitionTo <LevelScreen, LevelSettings>(LD46Game.Level0Settings !);
                }
                else
                {
                    _screens.TransitionTo <LevelScreen, LevelSettings>(_settings);
                }
            }

            if (_toot && _bindings.JustPressed(Bindings.Skip))
            {
                _screens.TransitionTo <LevelScreen, LevelSettings>(_settings.NextLevel);
            }

            if (_levelView.HasFadedOut && _settings.NextLevel != null)
            {
                _screens.TransitionTo <LevelScreen, LevelSettings>(_settings.NextLevel);
            }

            float deltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;

            if (Level.SlowMoTimer > 0f)
            {
                deltaTime /= 2f;
            }

            Level.Update(deltaTime);

            if (Level.PhysicsWorld.TryGetBody(_torchEntity.BodyID, out Body? torchBody))
            {
                if (!_hasWon && torchBody.Position.Y + torchBody.Bounds.Center.Y <= Level.FinishHeight)
                {
                    _hasWon = true;

                    Level.SlowMoTimer = float.MaxValue;
                }

                if (_hasWon)
                {
                    Level.CameraCenter += (torchBody.Position + torchBody.Bounds.Center - Level.CameraCenter) * 5f * (float)gameTime.ElapsedGameTime.TotalSeconds;

                    if (_winTimer < 1f)
                    {
                        _winTimer += deltaTime;
                        if (_winTimer >= 1f)
                        {
                            _levelView.FadeOut();
                        }
                    }
                }
            }

            float waterSpeedModifier = 1f;

            if (Level.PhysicsWorld.TryGetBody(_playerEntity.BodyID, out Body? playerBody))
            {
                if (!_hasWon)
                {
                    Level.CameraCenter = playerBody.Position + playerBody.Bounds.Center;
                }

                float yDistance = Math.Abs(playerBody.Position.Y - (Level.TileMap.Height * PhysicsConstants.TileSize - Level.WaterLevel));

                waterSpeedModifier *= Math.Max(yDistance * yDistance / 100000f, 1f);
            }

            Level.WaterLevel += _settings.WaterSpeed * waterSpeedModifier * deltaTime;

            if (_playerEntity.HasLostAllHope)
            {
                _levelView.ShowLoseScreen();
            }

            _levelView.Update(Level, deltaTime);
        }