diff --git a/FNAF_Clone.sln.DotSettings.user b/FNAF_Clone.sln.DotSettings.user index eba5de7..ac6c023 100644 --- a/FNAF_Clone.sln.DotSettings.user +++ b/FNAF_Clone.sln.DotSettings.user @@ -1,4 +1,5 @@  True + ForceIncluded ForceIncluded ForceIncluded \ No newline at end of file diff --git a/FNAF_Clone/CommandManager.cs b/FNAF_Clone/CommandManager.cs index d2321f7..4f5763f 100644 --- a/FNAF_Clone/CommandManager.cs +++ b/FNAF_Clone/CommandManager.cs @@ -14,7 +14,7 @@ public class CommandManager { private static InputListenerHook toggleCamHook = new(true); public static void InitInputListeners() { - Array.ForEach(keybinds, tuple => InputManager.AddListener(tuple.label, tuple.key, _ => tuple.action(), InputTiming.PRESS, toggleCamHook)); + Array.ForEach(keybinds, tuple => InputManager.AddListener(tuple.label, tuple.key, () => tuple.action(), InputTiming.PRESS, toggleCamHook)); } private static void ToggleCamera() { diff --git a/FNAF_Clone/Content/Content.mgcb b/FNAF_Clone/Content/Content.mgcb index ddc4c36..9060f47 100644 --- a/FNAF_Clone/Content/Content.mgcb +++ b/FNAF_Clone/Content/Content.mgcb @@ -13,3 +13,18 @@ #---------------------------------- Content ---------------------------------# +#begin images/SpriteSheet_testBlocks.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:images/SpriteSheet_testBlocks.png + +#begin images/testBlocks-definition.xml +/copy:images/testBlocks-definition.xml + diff --git a/FNAF_Clone/Content/images/SpriteSheet_testBlocks.png b/FNAF_Clone/Content/images/SpriteSheet_testBlocks.png new file mode 100644 index 0000000..87eba71 Binary files /dev/null and b/FNAF_Clone/Content/images/SpriteSheet_testBlocks.png differ diff --git a/FNAF_Clone/Content/images/testBlocks-definition.xml b/FNAF_Clone/Content/images/testBlocks-definition.xml new file mode 100755 index 0000000..7da4afc --- /dev/null +++ b/FNAF_Clone/Content/images/testBlocks-definition.xml @@ -0,0 +1,10 @@ + + + images/SpriteSheet_testBlocks + + + + + + + diff --git a/FNAF_Clone/GUI/Screen.cs b/FNAF_Clone/GUI/Screen.cs new file mode 100644 index 0000000..962a742 --- /dev/null +++ b/FNAF_Clone/GUI/Screen.cs @@ -0,0 +1,91 @@ +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); + } + } +} \ No newline at end of file diff --git a/FNAF_Clone/GUI/UIElement.cs b/FNAF_Clone/GUI/UIElement.cs new file mode 100644 index 0000000..bef026e --- /dev/null +++ b/FNAF_Clone/GUI/UIElement.cs @@ -0,0 +1,40 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using MonoGameLibrary.Graphics; +using MonoGameLibrary.Input; + +namespace FNAF_Clone.GUI; + +public class UIElement { + public bool Active { get; set; } = false; + public bool Pressable { get; set; } = false; + + private (Point, Point) bounds; // TODO: Change this to support non-rectangular hitboxes + private TextureRegion texture; + + public UIElement(TextureRegion texture, Point position) { + this.texture = texture; + bounds = (position, position + new Point(texture.Width, texture.Height)); + } + public void Update() { + + } + + public bool IsWithinBounds(Point pos) { + return pos.X >= Math.Min(bounds.Item1.X, bounds.Item2.X) && pos.X <= Math.Max(bounds.Item1.X, bounds.Item2.X) && + pos.Y >= Math.Min(bounds.Item1.Y, bounds.Item2.Y) && pos.Y <= Math.Max(bounds.Item1.Y, bounds.Item2.Y); + } + + public Action OnMousePress{ get; set; } + + // public virtual void OnMousePress() { } + + public virtual void OnMouseRelease() { } + + public virtual void OnMouseHold() { } + + public void Draw(SpriteBatch spriteBatch) { + texture.Draw(spriteBatch, bounds.Item1.ToVector2(), Color.White); + } +} \ No newline at end of file diff --git a/FNAF_Clone/GameMain.cs b/FNAF_Clone/GameMain.cs index 95f2e8f..b6076c9 100644 --- a/FNAF_Clone/GameMain.cs +++ b/FNAF_Clone/GameMain.cs @@ -1,27 +1,41 @@ -using Microsoft.Xna.Framework; +using System; +using FNAF_Clone.GUI; +using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using MonoGameLibrary; +using MonoGameLibrary.Graphics; using MonoGameLibrary.Input; namespace FNAF_Clone; -public class GameMain() : Core("fnafkooo", 1920, 1080, false) { - private GraphicsDeviceManager _graphics; - private SpriteBatch _spriteBatch; +public class GameMain() : Core("fnafkooo", 640, 360, false) { + // private GraphicsDeviceManager _graphics; + // private SpriteBatch _spriteBatch; + + private Screen officeScreen = new(Screen.ScreenType.OFFICE); + + private TextureAtlas testAtlas; protected override void Initialize() { Client.Connect("127.0.0.1", 9012); CommandManager.InitInputListeners(); + InputManager.AddListener(InputManager.MouseButton.LEFT, (() => Console.WriteLine("LMB pressed at: " + InputManager.MouseState.Position)), InputTiming.PRESS, new InputListenerHook(true)); + + base.Initialize(); } protected override void LoadContent() { - _spriteBatch = new SpriteBatch(GraphicsDevice); - + // spriteBatch = new SpriteBatch(GraphicsDevice); + testAtlas = TextureAtlas.FromFile(content, "images/testBlocks-definition.xml"); - // TODO: use this.Content to load your game content here + Screen.AddScreen("office", officeScreen, true); + officeScreen.AddElement("test", + new UIElement(testAtlas[0], Point.Zero) + {Pressable = true, OnMousePress = () => Console.WriteLine("Pressed!")} + ); } protected override void Update(GameTime gameTime) { @@ -39,9 +53,11 @@ public class GameMain() : Core("fnafkooo", 1920, 1080, false) { protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); + spriteBatch.Begin(); + + Screen.CurrentScreen.Draw(spriteBatch); - // TODO: Add your drawing code here - + spriteBatch.End(); base.Draw(gameTime); } } \ No newline at end of file diff --git a/MonoGameLibrary b/MonoGameLibrary index a2b524e..182ebfc 160000 --- a/MonoGameLibrary +++ b/MonoGameLibrary @@ -1 +1 @@ -Subproject commit a2b524ee04772d483750047c997172cc62090a9a +Subproject commit 182ebfc31c37c0759b5a41c1921273f1ba55b759