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; } }