/// <summary> /// Allows each screen to run logic. /// </summary> public override void Update(GameTime gameTime) { ClientGameTime clientGameTime = new ClientGameTime(gameTime); // Read the keyboard and gamepad. Input.Update(); audioEngine.Update(); // Make a copy of the master screen list, to avoid confusion if // the process of updating one screen adds or removes others. screensToUpdate.Clear(); foreach (GameScreen screen in screens) screensToUpdate.Add(screen); bool otherScreenHasFocus = !Game.IsActive; bool coveredByOtherScreen = false; // Loop as long as there are screens waiting to be updated. while (screensToUpdate.Count > 0) { // Pop the topmost screen off the waiting list. GameScreen screen = screensToUpdate[screensToUpdate.Count - 1]; screensToUpdate.RemoveAt(screensToUpdate.Count - 1); // Update the screen. screen.Update(clientGameTime, 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(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; } } // Print debug trace? if (traceEnabled) TraceScreens(); }
/// <summary> /// Tells each screen to draw itself. /// </summary> public override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); ClientGameTime clientGameTime = new ClientGameTime(gameTime); for (int index = 0; index < screens.Count; index++) { GameScreen screen = screens[index]; if (screen.ScreenState == ScreenState.Hidden) continue; screen.Draw(clientGameTime); } base.Draw(gameTime); }