/// <summary> /// Allows each screen to run logic. /// </summary> public override void Update(GameTime gameTime) { // Read the keyboard and gamepad. input.Update(); // Make a copy of the master screen list, to avoid confusion if // the process of updating one screen adds or removes others. tempScreensList.Clear(); foreach (GameScreen screen in screens) { tempScreensList.Add(screen); } bool otherScreenHasFocus = !Game.IsActive; bool coveredByOtherScreen = false; // Loop as long as there are screens waiting to be updated. while (tempScreensList.Count > 0) { // Pop the topmost screen off the waiting list. GameScreen screen = tempScreensList[tempScreensList.Count - 1]; tempScreensList.RemoveAt(tempScreensList.Count - 1); // Update the screen. screen.Update(gameTime, otherScreenHasFocus, coveredByOtherScreen); if (screen.ScreenState == ScreenState.TransitionOn || screen.ScreenState == ScreenState.Active) { // If this is the first active screen we came across, // give it a chance to handle input. if (!otherScreenHasFocus) { screen.HandleInput(gameTime, input); otherScreenHasFocus = true; } // If this is an active non-popup, inform any subsequent // screens that they are covered by it. if (!screen.IsPopup) { coveredByOtherScreen = true; } } } if (audioEnabled == true) { musicCategory.SetVolume(audioVolume); } else { musicCategory.SetVolume(0); } // Print debug trace? if (traceEnabled) { TraceScreens(); } }