public GameplayScreen()
        {
            TransitionOnTime  = TimeSpan.FromSeconds(1.5);
            TransitionOffTime = TimeSpan.FromSeconds(0.5);

            time_passed       = 0.0f;
            total_time_passed = 0.0f;

            currentLevel = 1;

            InitializeLevels();

            // sounds
            m_player_wall = SoundMaster.GetSound("jump_thud");

            // Initialize Player.
            mPlayer     = new Player(GetLevel(currentLevel).LevelStart, Vector3.Zero);
            mPlayer.Yaw = GetLevel(currentLevel).LevelStartDirection;
            mPlayer.PlayerCamera.Orientation = Quaternion.CreateFromAxisAngle(Vector3.Up, GetLevel(currentLevel).LevelStartDirection);

            // Initialize input device states.
            keyboardState    = Keyboard.GetState();
            gamepadState     = GamePad.GetState(PlayerIndex.One);
            oldKeyboardState = keyboardState;
            oldGamepadState  = gamepadState;
        }
        public override void Update(GameTime gameTime, bool otherScreenHasFocus,
            bool coveredByOtherScreen)
        {
            base.Update(gameTime, otherScreenHasFocus, false);

            // Gradually fade in or out depending on whether we are covered by the pause screen.
            if (coveredByOtherScreen)
                pauseAlpha = Math.Min(pauseAlpha + 1f / 32, 1);
            else
                pauseAlpha = Math.Max(pauseAlpha - 1f / 32, 0);

            if (IsActive)
            {
                // Get new input states.
                keyboardState = Keyboard.GetState();
                gamepadState  = GamePad.GetState(PlayerIndex.One);

                #region Controls
                #region Keyboard
                /* Space */

                // Jump.
                if (keyboardState.IsKeyDown(Keys.Space) && oldKeyboardState.IsKeyUp(Keys.Space))
                    mPlayer.Jump();

                /* WASD */

                // Move forward.
                if (keyboardState.IsKeyDown(Keys.W))
                    mPlayer.Move(0.0f, 1.0f);

                // Move backward.
                if (keyboardState.IsKeyDown(Keys.S))
                    mPlayer.Move(0.0f, -1.0f);

                // Move left.
                if (keyboardState.IsKeyDown(Keys.A))
                    mPlayer.Move(-1.0f, 0.0f);

                // Move right.
                if (keyboardState.IsKeyDown(Keys.D))
                    mPlayer.Move(1.0f, 0.0f);

                /* Arrow Keys */

                // Look up.
                if (keyboardState.IsKeyDown(Keys.Up))
                    mPlayer.AdjustPitch(1.0f);

                // Look down.
                if (keyboardState.IsKeyDown(Keys.Down))
                    mPlayer.AdjustPitch(-1.0f);

                // Look left.
                if (keyboardState.IsKeyDown(Keys.Left))
                    mPlayer.AdjustYaw(-1.0f);

                // Look right.
                if (keyboardState.IsKeyDown(Keys.Right))
                    mPlayer.AdjustYaw(1.0f);

                /* I */

                // Interact
                if(keyboardState.IsKeyDown(Keys.I) && oldKeyboardState.IsKeyUp(Keys.I))
                    GetLevel(currentLevel).Interact(mPlayer.Bound, gameTime);

                /* T */

                // Throw
                if(keyboardState.IsKeyDown(Keys.T) && oldKeyboardState.IsKeyUp(Keys.T))
                    mPlayer.Throw(gameTime);

                // Display Backpack
                if ((keyboardState.IsKeyDown(Keys.B) && oldKeyboardState.IsKeyUp(Keys.B)))
                    drawBackpack = true;
                else
                    drawBackpack = false;
                #endregion

                #region Controller
                if (gamepadState.IsConnected)
                {
                    /* Right Shoulder or A Button */

                    // Jump.
                    if (((gamepadState.Buttons.RightShoulder == ButtonState.Pressed) && (oldGamepadState.Buttons.RightShoulder == ButtonState.Released))
                        || ((gamepadState.Buttons.A == ButtonState.Pressed) && (oldGamepadState.Buttons.A == ButtonState.Released)))
                        mPlayer.Jump();

                    /* Y Button */

                    // Display Backpack
                    if ((gamepadState.Buttons.Y == ButtonState.Pressed))
                        drawBackpack = true;
                    else
                        drawBackpack = false;

                    /* B Button */

                    // Throw Projectile.
                    if ((gamepadState.Buttons.B == ButtonState.Pressed) && (oldGamepadState.Buttons.B == ButtonState.Released))
                        mPlayer.Throw(gameTime);

                    /* X Button */

                    // Interact.
                    if ((gamepadState.Buttons.X == ButtonState.Pressed) && (oldGamepadState.Buttons.X == ButtonState.Released))
                        GetLevel(currentLevel).Interact(mPlayer.Bound, gameTime);

                    /* Left Shoulder Button */

                    // Complete current Level.
                    if ((gamepadState.Buttons.LeftShoulder == ButtonState.Pressed) && (oldGamepadState.Buttons.LeftShoulder == ButtonState.Released))
                        GetLevel(currentLevel).IsCompleted = true;

                    /* Right Joystick */

                    // Rotate.
                    mPlayer.AdjustYaw(gamepadState.ThumbSticks.Right.X);
                    mPlayer.AdjustPitch(gamepadState.ThumbSticks.Right.Y);

                    /* Left Joystick */

                    // Move.
                    mPlayer.Move(gamepadState.ThumbSticks.Left.X, gamepadState.ThumbSticks.Left.Y);
                }
                #endregion
                #endregion

                #region Collision Detection
                // Update Player.
                mPlayer.Update(gameTime);

                /* Collision detection */

                BoundingBox BoundHit = new BoundingBox();
                if (GetLevel(currentLevel).HitWall(mPlayer.Bound, ref BoundHit))
                {
                    // Create contact point. Radius = 100 for player wall collisions
                    PointManagerRemake.add_Point(new Vector4(mPlayer.Position, 0.0f), gameTime.TotalGameTime.Milliseconds, 100.0f);

                    /* Compute collision normal. */

                    Vector3 vNorm = new Vector3();

                    if (mPlayer.Position.X <= BoundHit.Min.X)
                        vNorm = Vector3.Left;
                    if (mPlayer.Position.X > BoundHit.Max.X)
                        vNorm = Vector3.Right;
                    if (mPlayer.Position.Z <= BoundHit.Min.Z)
                        vNorm = Vector3.Forward;
                    if (mPlayer.Position.Z > BoundHit.Max.Z)
                        vNorm = Vector3.Backward;

                    // Get vector projection.
                    Vector3 vProj = Vector3.Dot(mPlayer.Velocity, vNorm) * vNorm;
                    vProj.Normalize();

                    // Store Player position.
                    Vector3 oldPos = mPlayer.Position;

                    // Revert Player position.
                    Vector3 newPos = mPlayer.Position + (2.0f) * vNorm;
                    newPos.Y = mPlayer.Position.Y;
                    mPlayer.Position = newPos;

                    // Update Player velocity.
                    mPlayer.Velocity = (-1.0f) * vProj * (new Vector3(mPlayer.Velocity.X, 0.0f, mPlayer.Velocity.Z).Length());

                    // Update Camera position.
                    mPlayer.PlayerCamera.Move(newPos - oldPos);

                    // play sound effect for player
                    m_player_wall.Play();
                }
                #endregion

                if (beginGame)
                {
                    ScreenManager.AddScreen(new FinishLevelScreen("begin", true), ControllingPlayer);
                    ScreenManager.AddScreen(new FinishLevelScreen("begin2", true), ControllingPlayer);
                    ScreenManager.AddScreen(new FinishLevelScreen("begin3", true), ControllingPlayer);
                    beginGame = false;
                }

                #region Level Complete
                // Level Completed.
                if (GetLevel(currentLevel).IsCompleted)
                {
                    ScreenManager.AddScreen(new FinishLevelScreen(currentLevel.ToString(), true), ControllingPlayer);
                    CleanUp();
                    currentLevel++;
                    PointManagerRemake.ClearAll();

                    if (finishGame)
                    {
                        this.ExitScreen();
                        ScreenManager.AddScreen(new BackgroundScreen(), null);
                        ScreenManager.AddScreen(new MainMenuScreen(), null);
                    }

                    if (currentLevel > NUMLEVELS)
                    {
                        currentLevel = NUMLEVELS;
                        finishGame = true;
                    }

                    mPlayer                          = new Player(Vector3.Zero, Vector3.Zero);
                    mPlayer.Position                 = GetLevel(currentLevel).LevelStart;
                    mPlayer.PlayerCamera.Position    = mPlayer.Position;
                    mPlayer.Yaw                      = GetLevel(currentLevel).LevelStartDirection;
                    mPlayer.PlayerCamera.Orientation = Quaternion.CreateFromAxisAngle(Vector3.Up, GetLevel(currentLevel).LevelStartDirection);

                    mPlayer.PlayerCamera.Update();
                }
                #endregion

                #region Game Over
                // Game Over.
                if (GetLevel(currentLevel).Update(mPlayer.Bound, gameTime))
                {
                    Exception ex = new Exception("add level to switch statement");

                    CleanUp();

                    ScreenManager.AddScreen(new FinishLevelScreen("Fail", true), ControllingPlayer);
                    switch (currentLevel)
                    {
                        case 1:
                            InitializeLevel_01();
                            break;
                        case 2:
                            InitializeLevel_02();
                            break;
                        case 3:
                            InitializeLevel_03();
                            break;
                        case 4:
                            InitializeLevel_04();
                            break;
                        case 5:
                            InitializeLevel_05();
                            break;
                        case 6:
                            InitializeLevel_06();
                            break;
                        case 7:
                            InitializeLevel_07();
                            break;
                        default:
                            throw ex;
                    }

                    mPlayer                          = new Player(Vector3.Zero, Vector3.Zero);
                    mPlayer.Position                 = GetLevel(currentLevel).LevelStart;
                    mPlayer.PlayerCamera.Position    = mPlayer.Position;
                    mPlayer.Yaw                      = GetLevel(currentLevel).LevelStartDirection;
                    mPlayer.PlayerCamera.Orientation = Quaternion.CreateFromAxisAngle(Vector3.Up, GetLevel(currentLevel).LevelStartDirection);

                    mPlayer.PlayerCamera.Update();
                }
                    //LoadingScreen.Load(ScreenManager, false, null, new BackgroundScreen(), new MainMenuScreen());
                #endregion

                #region Point Manager
                // Update Point Manager.
                float temp = gameTime.TotalGameTime.Milliseconds;
                if ((temp - time_passed) > 0)
                {
                    total_time_passed += (temp - time_passed);
                    PointManagerRemake.updateTime(temp - time_passed);
                }
                else
                {
                    total_time_passed += temp;
                    PointManagerRemake.updateTime(temp);
                }
                #endregion

                // Set old input states.
                oldKeyboardState = keyboardState;
                oldGamepadState  = gamepadState;
            }
        }