using System.Collections.Generic; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using MonoGameLibrary.Input; namespace FNAF_Clone.GUI; public class Screen { public static Dictionary Screens = new(); public static Screen CurrentScreen{ get; private set; } public static void AddScreens((string id, Screen screen)[] screens) { foreach (var tuple in screens){ Screens.Add(tuple.id, tuple.screen); } } public static void AddScreen(string id, Screen screen, bool activate = false) { Screens.Add(id, screen); if (activate) SetScreen(id); } public static void SetScreen(string id) { CurrentScreen = Screens[id]; CurrentScreen.Active = true; } public static void RemoveScreen(string id) { Screens.Remove(id); } public enum ScreenType { MAIN_MENU, OFFICE, CAMERAS } public ScreenType Type{ get; private set; } private Dictionary elements = new(); public bool Active { get; private set; } = false; private InputListenerHook mouseInputHook = new(true); public Screen(ScreenType type) { Type = type; InputManager.AddListener(InputManager.MouseButton.LEFT, () => ProcessMouseInput(InputManager.MouseState), InputTiming.PRESS, mouseInputHook); } public Screen(ScreenType type, Dictionary elements) { this.elements = elements; Type = type; } public void AddElement(string id, UIElement element) { elements.Add(id, element); } public void SetActive(bool active) { Active = active; if (Active == active) return; foreach (var keyValuePair in elements){ keyValuePair.Value.Active = Active; } } private void ProcessMouseInput(MouseState mouseState) { foreach (var element in elements.Values){ if (!element.Pressable) continue; if (element.IsWithinBounds(mouseState.Position)){ element.OnMousePress(); // TODO: differentiate between press, hold and release events } } } public void Update() { foreach (var keyValuePair in elements){ keyValuePair.Value.Update(); } } public void Draw(SpriteBatch spriteBatch) { foreach (var val in elements.Values){ val.Draw(spriteBatch); } } }