91 lines
2.5 KiB
C#
91 lines
2.5 KiB
C#
|
|
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<string, Screen> 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<string, UIElement> 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<string, UIElement> 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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|