//set all screens back to their original state public static void ResumeAll() { for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.Overridable) { foundScreen.State = foundScreen.LastState; } } }
//Find if a screen is loaded public static bool Find(string name) { for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (name == foundScreen.Name) { return(true); } } return(false); }
//remove a screen public static void RemoveScreen(string screen) { for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.Name == screen) { foundScreen.Remove(); break; } } }
//Manually set the state of a screen from another screen public static void SetState(ScreenState State, string name) { for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (name.Equals(foundScreen.Name)) { foundScreen.State = State; foundScreen.OnStateChange(); } } }
//Manually set the state of a screen from another screen public static void SetActive(string id) { BaseScreen nextScreen = Find(id); if (nextScreen != null) { if (currentScreen != null) { currentScreen.Unload(); } currentScreen = nextScreen; currentScreen.Load(); } }
//set all screens to frozen if overridable, exception for focused screen public static void FreezeAll(string exception) { for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.Name != exception) { if (foundScreen.Overridable) { foundScreen.LastState = foundScreen.State; foundScreen.State = ScreenState.Frozen; } } } }
//MURDER all screens, option to force if overridable doesn't matter(ex. game over), also option for exception so you don't delete all your screens public static void KillAll(bool force, string exception) { for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.Name != exception) { if (force) { foundScreen.State = ScreenState.Shutdown; } else { if (foundScreen.Overridable) { foundScreen.State = ScreenState.Shutdown; } } } } }
public static void PollInput() { MouseState mouseState = Mouse.GetState(); if (mouseState.LeftButton == ButtonState.Pressed && !lmbClicked) { lmbClicked = true; for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.State == ScreenState.Active) { foundScreen.OnClick(true, mouseState.X, mouseState.Y); } } } else if (mouseState.LeftButton != ButtonState.Pressed && lmbClicked) { lmbClicked = false; } if (mouseState.RightButton == ButtonState.Pressed && !rmbClicked) { rmbClicked = true; for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.State == ScreenState.Active) { foundScreen.OnClick(false, mouseState.X, mouseState.Y); } } } else if (mouseState.RightButton != ButtonState.Pressed && rmbClicked) { rmbClicked = false; } }
//Add a new screen public static void AddScreen(BaseScreen screen) { Screens.Add(screen); }
//Add a new screen public static void RegisterScreen(BaseScreen screen) { Screens.Add(screen); }
public void Update() { //We iterate backwards here so that we can remove from the list more intuitvley and avoid concurent modifications. for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; if (foundScreen.State == ScreenState.Shutdown) { Screens.RemoveAt(i); } else { foundScreen.Focused = false; } } //Find the screen to focus on if (Screens.Count > 0) { for (int i = 0; i < Screens.Count; i++) { if (Screens[i].GrabFocus) { Screens[i].Focused = true; break; } } } PollInput(); //Update the appropriate screens for (int i = Screens.Count() - 1; i >= 0; i--) { BaseScreen foundScreen = Screens[i]; switch (foundScreen.State) { case ScreenState.Active: foundScreen.Update(); foundScreen.HandleInput(); break; case ScreenState.Frozen: foundScreen.Update(); break; case ScreenState.Background: foundScreen.Update(); break; case ScreenState.Hiding: foundScreen.Update(); foundScreen.HandleInput(); break; case ScreenState.Paused: foundScreen.HandleInput(); break; } } }