public void AddScreen(Screen screen)
        {
            screen.IsExiting = false;

            // IScreenContext を設定します。
            screen.ScreenContext = this;

            // 排他的画面が登録されたら他の全ての画面を TransitionOff に移行させます。
            if (screen.IsExclusive)
            {
                foreach (var otherScreen in screens)
                {
                    ExitScreen(otherScreen);
                }
            }

            // グラフィック デバイスを備えている場合、画面がコンテンツを
            // 読み込むように指示します。
            if (isInitialized)
            {
                screen.LoadContent();
            }

            screens.Add(screen);
        }
        /// <summary>
        /// 画面の移行位置を更新するためのヘルパー。
        /// </summary>
        bool UpdateTransition(GameTime gameTime, Screen screen, TimeSpan time, int direction)
        {
            // どの程度移動する必要がありますか?
            float transitionDelta = 1;
            if (time != TimeSpan.Zero)
            {
                transitionDelta = (float) (gameTime.ElapsedGameTime.TotalMilliseconds / time.TotalMilliseconds);
            }

            // 移行位置を更新します。
            screen.TransitionPosition += transitionDelta * direction;

            // 移行の最後に到達しましたか?
            if (((direction < 0) && (screen.TransitionPosition <= 0)) ||
                ((direction > 0) && (screen.TransitionPosition >= 1)))
            {
                screen.TransitionPosition = MathHelper.Clamp(screen.TransitionPosition, 0, 1);
                return false;
            }

            // transitionPosition に到達していない場合、まだ移行が行われています。
            return true;
        }
        public void RemoveScreen(Screen screen)
        {
            screens.Remove(screen);

            // グラフィック デバイスを備えている場合、画面がコンテンツを
            // アンロードするように指示します。
            if (isInitialized)
            {
                screen.UnloadContent();
            }
        }
        void UpdateTransition(GameTime gameTime, Screen screen)
        {
            if (screen.IsExiting)
            {
                // 画面が完全に消去される場合は、まず「オフへ移行中」に相当する
                // TransitionOff の状態に設定されます。
                screen.ScreenState = ScreenState.TransitionOff;

                if (!UpdateTransition(gameTime, screen, screen.TransitionOffTime, 1))
                {
                    // 移行が完了すると、画面が ScreenService から削除されます。
                    RemoveScreen(screen);
                }
            }
            else if (!screen.IsBackground && screen.IsCovered)
            {
                // isBackground = true ならば、画面が他の画面に覆われると TransitionOff の状態にします。
                // isBackground = false は常に他の画面に覆われる前提の画面です。
                if (UpdateTransition(gameTime, screen, screen.TransitionOffTime, 1))
                {
                    // まだオフへの移行中です。
                    screen.ScreenState = ScreenState.TransitionOff;
                }
                else
                {
                    // 移行が完了し、画面が隠蔽されます。
                    screen.ScreenState = ScreenState.Hidden;
                }
            }
            else
            {
                // 最後が「オフへ移行中」でない場合は「オンへ移行中」の状態になり
                // 移行が完了した時点でアクティブ画面となります。
                if (UpdateTransition(gameTime, screen, screen.TransitionOnTime, -1))
                {
                    // まだオンへの移行中です。
                    screen.ScreenState = ScreenState.TransitionOn;
                }
                else
                {
                    // 移行が完了し、画面がアクティブになります。
                    screen.ScreenState = ScreenState.Active;
                }
            }
        }
 public void ExitScreen(Screen screen)
 {
     if (screen.TransitionOffTime == TimeSpan.Zero)
     {
         // 画面の移行時間がゼロに設定されている場合は、すぐに削除されます。
         RemoveScreen(screen);
     }
     else
     {
         // それ以外の場合、オフに移行してから終了するようにフラグを設定します。
         screen.IsExiting = true;
     }
 }