/// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // MONO: Add your update logic here

            //In every State you are able to quit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            {
                Exit();
            }

            lastGameState = currentGameState;

            //MUSIC Updating Timer
            audioManager.UpdateAudioManagerTimer(gameTime);

            //Update Timer
            float animationFrameTime = 0.02f;

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

            timeUntilNextFrame1 -= gameFrameTime;
            timeUntilNextFrame2 -= gameFrameTime;

            switch (currentGameState)
            {
            case GameState.SPLASHSCREEN:
                splashScreen.ClickedButton();
                break;

            case GameState.MAINMENU:
                if (MediaPlayer.State != 0)
                {
                    MediaPlayer.Stop();
                    turnOnMusic = true;
                }
                mainMenu.Update(this);
                this.IsMouseVisible = true;
                break;

            case GameState.LEVELEDITOR:

                levelEditor.HandleLevelEditorEvents();

                levelEditor.moveOrDeletePlatforms(ref allGameObjectList, transformationMatrix);
                this.IsMouseVisible = true;
                levelEditor.moveCamera(ref cameraOffset);
                // Makes player movable in the leveleditor //Enemies are alive but not visible
                gameObjectsToRender = camera.GameObjectsToRender(wormPlayer.gameObjectPosition, allGameObjectList, ref interactiveObject);
                wormPlayer.Update(gameTime, gameObjectsToRender, ref viewableEnemies, interactiveObject, ref allGameObjectList, loadAndSave, ingameMenus, levelManager, ref allGameObjectList, shopKeeper, itemUIManager, ref hakume);
                break;

            case GameState.GAMELOOP:

                this.IsMouseVisible = false;

                //MUSIC
                if (turnOnMusic)
                {
                    audioManager.Play("IngameMusic");
                    turnOnMusic = false;
                }

                //switch to LevelEditor
                levelManager.ManageLevels(wormPlayer.gameObjectPosition);
                itemUIManager.ManageItems(ref wormPlayer, ref levelObjectList);
                if (currentGameState == GameState.GAMELOOP)
                {
                    //cameraOffset = new Vector2(0, 0);
                    if (Keyboard.GetState().IsKeyDown(Keys.L) && !previousState.IsKeyDown(Keys.L))
                    {
                        currentGameState = GameState.LEVELEDITOR;
                    }
                    //previousState = Keyboard.GetState();
                    if (Keyboard.GetState().IsKeyDown(Keys.M) && !previousState.IsKeyDown(Keys.M) && levelManager.currentLevel != Enums.Level.TUTORIAL)
                    {
                        currentGameState = GameState.MINIMAP;
                    }
                    if ((Keyboard.GetState().IsKeyDown(Keys.P) && !previousState.IsKeyDown(Keys.P)) || (GamePad.GetState(0).IsButtonDown(Buttons.Start) && !previousGamePadState.IsButtonDown(Buttons.Start)))
                    {
                        currentGameState = GameState.GAMEMENU;
                    }

                    previousState        = Keyboard.GetState();
                    previousGamePadState = GamePad.GetState(0);
                }

                if (shopKeeper.shopOpen == true)
                {
                    shopKeeper.handleShopKeeperEvents();
                }


                if (timeUntilNextFrame1 <= 0)
                {
                    gameObjectsToRender  = camera.GameObjectsToRender(wormPlayer.gameObjectPosition, levelObjectList, ref interactiveObject);
                    timeUntilNextFrame1 += animationFrameTime;
                }


                camera.SpawnEnemyOffScreen(wormPlayer, enemySpawnList, ref enemyList, enemySpriteSheets, levelManager.PlayerLevelLocation());
                if (!camera.spawnBoss)
                {
                    viewableEnemies = camera.RenderedEnemies(wormPlayer.gameObjectPosition, enemyList);
                }
                wormPlayer.Update(gameTime, gameObjectsToRender, ref viewableEnemies, interactiveObject, ref levelObjectList, loadAndSave, ingameMenus, levelManager, ref allGameObjectList, shopKeeper, itemUIManager, ref hakume);

                if (timeUntilNextFrame2 <= 0)
                {
                    if (levelManager.PlayerLevelLocation() != Enums.Level.CROWN)
                    {
                        foreach (var enemy in viewableEnemies.ToList())
                        {
                            enemy.Update(gameTime, gameObjectsToRender);
                            if (enemy.EnemyAliveState() == false || enemy.fallOutOfMap)
                            {
                                viewableEnemies.RemoveAt(viewableEnemies.IndexOf(enemy));
                            }
                        }
                    }
                    if (levelManager.PlayerLevelLocation() == Enums.Level.CROWN)
                    {
                        if (hakume != null)
                        {
                            hakume.Update(gameTime, gameObjectsToRender);
                        }
                        if (hakume.EnemyAliveState() == false)
                        {
                            hakume = null;
                        }
                    }

                    timeUntilNextFrame2 += animationFrameTime;
                }
                break;

            case GameState.MINIMAP:
                if (Keyboard.GetState().IsKeyDown(Keys.M) && !previousState.IsKeyDown(Keys.M))
                {
                    currentGameState = GameState.GAMELOOP;
                }
                previousState = Keyboard.GetState();
                break;

            case GameState.GAMEMENU:
                gameMenu.Update(this, loadAndSave);
                break;

            case GameState.CREDITS:
                credits.UpdateCredits();
                break;
            }
        }