/// <summary> /// Tells the screen to go away. Unlike ScreenManager.RemoveScreen, which /// instantly kills the screen, this method respects the transition timings /// and will give the screen a chance to gradually transition off. /// </summary> public void ExitScreen() { if (TransitionOffTime == TimeSpan.Zero) { // If the screen has a zero transition time, remove it immediately. ScreenManager.RemoveScreen(this); } else { // Otherwise flag that it should transition off and then exit. IsExiting = true; } }
/// <summary> /// Allows the screen to run logic, such as updating the transition position. /// Unlike HandleInput, this method is called regardless of whether the screen /// is active, hidden, or in the middle of a transition. /// </summary> public virtual void Update(GameTime gameTime, bool otherScreenHasFocus, bool coveredByOtherScreen) { _otherScreenHasFocus = otherScreenHasFocus; if (IsExiting) { // If the screen is going away to die, it should transition off. ScreenState = ScreenState.TransitionOff; if (!UpdateTransition(gameTime, TransitionOffTime, 1)) { // When the transition finishes, remove the screen. ScreenManager.RemoveScreen(this); } } else if (coveredByOtherScreen) { // If the screen is covered by another, it should transition off. if (UpdateTransition(gameTime, TransitionOffTime, 1)) { // Still busy transitioning. ScreenState = ScreenState.TransitionOff; } else { // Transition finished! ScreenState = ScreenState.Hidden; } } else { // Otherwise the screen should transition on and become active. if (UpdateTransition(gameTime, TransitionOnTime, -1)) { // Still busy transitioning. ScreenState = ScreenState.TransitionOn; } else { // Transition finished! ScreenState = ScreenState.Active; } } }