From 2cd215cc3334a37065969e3a3a52932e3953ac98 Mon Sep 17 00:00:00 2001 From: Perry Date: Mon, 26 Jan 2026 09:39:17 +0100 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1ny=20sprity=20pro=20kancel=C3=A1?= =?UTF-8?q?=C5=99=20a=20monitor.=20Graficky=20viditeln=C3=A9=20zav=C3=ADr?= =?UTF-8?q?=C3=A1n=C3=AD=20a=20otev=C3=ADr=C3=A1n=C3=AD=20dve=C5=99=C3=AD,?= =?UTF-8?q?=20zap=C3=ADn=C3=A1n=C3=AD=20a=20vyp=C3=ADn=C3=A1n=C3=AD=20moni?= =?UTF-8?q?toru.=20Podpora=20pouze=20pro=20specifick=C3=A1=20rozli=C5=A1en?= =?UTF-8?q?=C3=AD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FNAF_Clone/Client.cs | 3 + FNAF_Clone/CommandManager.cs | 23 ++++--- FNAF_Clone/Content/Content.mgcb | 30 ++++++++ .../Content/images/SpriteSheet_monitor.png | Bin 0 -> 4674 bytes .../Content/images/SpriteSheet_office.png | Bin 0 -> 12886 bytes .../Content/images/monitor-definition.xml | 12 ++++ .../Content/images/office-definition.xml | 13 ++++ FNAF_Clone/FNAF_Clone.csproj | 1 + FNAF_Clone/GUI/PointExtensions.cs | 7 ++ FNAF_Clone/GUI/Screen.cs | 28 ++++---- FNAF_Clone/GUI/UIElement.cs | 42 +++++++++++- FNAF_Clone/GUI/UIManager.cs | 64 ++++++++++++++++++ FNAF_Clone/GameMain.cs | 20 ++---- 13 files changed, 202 insertions(+), 41 deletions(-) create mode 100644 FNAF_Clone/Content/images/SpriteSheet_monitor.png create mode 100644 FNAF_Clone/Content/images/SpriteSheet_office.png create mode 100644 FNAF_Clone/Content/images/monitor-definition.xml create mode 100755 FNAF_Clone/Content/images/office-definition.xml create mode 100644 FNAF_Clone/GUI/PointExtensions.cs create mode 100644 FNAF_Clone/GUI/UIManager.cs diff --git a/FNAF_Clone/Client.cs b/FNAF_Clone/Client.cs index c759a7d..2620ec0 100644 --- a/FNAF_Clone/Client.cs +++ b/FNAF_Clone/Client.cs @@ -1,6 +1,7 @@ using System; using System.Net; using System.Net.Sockets; +using FNAF_Clone.GUI; using LiteNetLib; using LiteNetLib.Utils; using PacketLib; @@ -90,10 +91,12 @@ public class Client { break; case 3: // toggle cam Player.state.monitorUp = e.Args[1] == 1; + UIManager.ChangeMonitorState(e.Args[1] == 1); Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}"); break; case 4: // toggle door Player.state.doorStates[e.Args[1]] = e.Args[2] == 1; + UIManager.ChangeDoorState(e.Args[1], e.Args[2] == 1); Console.WriteLine($"E: Player {e.Args[0]} {(e.Args[2] == 1 ? "closed" : "opened")} door {e.Args[1]}"); break; case -1: // movement diff --git a/FNAF_Clone/CommandManager.cs b/FNAF_Clone/CommandManager.cs index ee41efb..2f77446 100644 --- a/FNAF_Clone/CommandManager.cs +++ b/FNAF_Clone/CommandManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using FNAF_Clone.GUI; using Microsoft.Xna.Framework.Input; using MonoGameLibrary.Input; using PacketLib; @@ -8,10 +9,10 @@ namespace FNAF_Clone; public class CommandManager { private static (string label, Keys key, Action action)[] keybinds = [ - ("Toggle Camera", Keys.S, ToggleCamera), - ("Toggle left door", Keys.D1, ToggleDoorLeft), - ("Toggle centre door", Keys.D2, ToggleDoorCentre), - ("Toggle right door", Keys.D3, ToggleDoorRight) + ("Toggle Camera", Keys.Space, SendToggleCamera), + ("Toggle left door", Keys.A, ToggleDoorLeft), + ("Toggle centre door", Keys.W, ToggleDoorCentre), + ("Toggle right door", Keys.D, ToggleDoorRight) ]; @@ -21,15 +22,19 @@ public class CommandManager { Array.ForEach(keybinds, tuple => InputManager.AddListener(tuple.label, tuple.key, () => tuple.action(), InputTiming.PRESS, toggleCamHook)); } - private static void ToggleCamera() { + private static void SendToggleCamera() { Client.SendCommands([PlayerCommand.TOGGLE_MONITOR()]); } - private static void ToggleDoorLeft() => ToggleDoor(0); - private static void ToggleDoorCentre() => ToggleDoor(1); - private static void ToggleDoorRight() => ToggleDoor(2); + private static void ToggleDoorLeft() => SendToggleDoor(0); + private static void ToggleDoorCentre() => SendToggleDoor(1); + private static void ToggleDoorRight() => SendToggleDoor(2); - private static void ToggleDoor(int id) { + private static void SendToggleDoor(int id) { + if (Screen.CurrentScreen.Label == UIManager.ScreenTypes.CAMERAS){ + //TODO: camera doors + return; + } Client.SendCommands([PlayerCommand.TOGGLE_DOOR_OFFICE(id)]); } } \ No newline at end of file diff --git a/FNAF_Clone/Content/Content.mgcb b/FNAF_Clone/Content/Content.mgcb index 9060f47..261666d 100644 --- a/FNAF_Clone/Content/Content.mgcb +++ b/FNAF_Clone/Content/Content.mgcb @@ -13,6 +13,36 @@ #---------------------------------- Content ---------------------------------# +#begin images/monitor-definition.xml +/copy:images/monitor-definition.xml + +#begin images/office-definition.xml +/copy:images/office-definition.xml + +#begin images/SpriteSheet_monitor.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_monitor.png + +#begin images/SpriteSheet_office.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_office.png + #begin images/SpriteSheet_testBlocks.png /importer:TextureImporter /processor:TextureProcessor diff --git a/FNAF_Clone/Content/images/SpriteSheet_monitor.png b/FNAF_Clone/Content/images/SpriteSheet_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..b673913bfbf4ddea21b5c2ad65911d1473f50f65 GIT binary patch literal 4674 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 M*zLWm)Rmn64|SRE^#A|> literal 0 HcmV?d00001 diff --git a/FNAF_Clone/Content/images/SpriteSheet_office.png b/FNAF_Clone/Content/images/SpriteSheet_office.png new file mode 100644 index 0000000000000000000000000000000000000000..057c2dbf895e21f384d444b574647598a80fa66a GIT binary patch literal 12886 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 + + images/SpriteSheet_monitor + + + + + + + + + diff --git a/FNAF_Clone/Content/images/office-definition.xml b/FNAF_Clone/Content/images/office-definition.xml new file mode 100755 index 0000000..09f8b3f --- /dev/null +++ b/FNAF_Clone/Content/images/office-definition.xml @@ -0,0 +1,13 @@ + + + images/SpriteSheet_office + + + + + + + + + + diff --git a/FNAF_Clone/FNAF_Clone.csproj b/FNAF_Clone/FNAF_Clone.csproj index 7c07fc9..83748ba 100644 --- a/FNAF_Clone/FNAF_Clone.csproj +++ b/FNAF_Clone/FNAF_Clone.csproj @@ -5,6 +5,7 @@ Major false false + 14 app.manifest diff --git a/FNAF_Clone/GUI/PointExtensions.cs b/FNAF_Clone/GUI/PointExtensions.cs new file mode 100644 index 0000000..529bd48 --- /dev/null +++ b/FNAF_Clone/GUI/PointExtensions.cs @@ -0,0 +1,7 @@ +using Microsoft.Xna.Framework; + +namespace FNAF_Clone.GUI; + +public static class PointExtensions { + public static Point MultiplyByScalar(this Point point, int scalar) => new(point.X * scalar, point.Y * scalar); +} \ No newline at end of file diff --git a/FNAF_Clone/GUI/Screen.cs b/FNAF_Clone/GUI/Screen.cs index 962a742..09172d7 100644 --- a/FNAF_Clone/GUI/Screen.cs +++ b/FNAF_Clone/GUI/Screen.cs @@ -11,9 +11,9 @@ 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 AddScreens(Screen[] screens) { + foreach (var screen in screens){ + Screens.Add(screen.Label, screen); } } public static void AddScreen(string id, Screen screen, bool activate = false) { @@ -29,28 +29,24 @@ public class Screen { public static void RemoveScreen(string id) { Screens.Remove(id); } - - public enum ScreenType { - MAIN_MENU, - OFFICE, - CAMERAS - } - - - public ScreenType Type{ get; private set; } + + + public string Label; private Dictionary elements = new(); public bool Active { get; private set; } = false; private InputListenerHook mouseInputHook = new(true); - public Screen(ScreenType type) { - Type = type; + public Screen(string label) { + Label = label; InputManager.AddListener(InputManager.MouseButton.LEFT, () => ProcessMouseInput(InputManager.MouseState), InputTiming.PRESS, mouseInputHook); } - public Screen(ScreenType type, Dictionary elements) { + public Screen(string label, Dictionary elements) { this.elements = elements; - Type = type; + Label = label; } + + public UIElement this[string id] => elements[id]; public void AddElement(string id, UIElement element) { elements.Add(id, element); diff --git a/FNAF_Clone/GUI/UIElement.cs b/FNAF_Clone/GUI/UIElement.cs index bef026e..1160e38 100644 --- a/FNAF_Clone/GUI/UIElement.cs +++ b/FNAF_Clone/GUI/UIElement.cs @@ -1,21 +1,56 @@ using System; +using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using MonoGameLibrary; 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; + private List textures = new(); + private int currentTextureId = 0; + private float _scaleMultiplier = 1; + public float ScaleMultiplier{ + get{ + return _scaleMultiplier; + } + set{ + _scaleMultiplier = value; + LoadPixelScaleMultiplier(); + } + } + private float pixelScaleMultiplier = 1; + private void LoadPixelScaleMultiplier() { + pixelScaleMultiplier = UIManager.GlobalPixelMultiplier * _scaleMultiplier; + } + public UIElement(TextureRegion texture, Point position) { - this.texture = texture; + textures.Add(texture); bounds = (position, position + new Point(texture.Width, texture.Height)); + LoadPixelScaleMultiplier(); + } + public UIElement(TextureRegion[] textures, Point position) { + this.textures.AddRange(textures); + bounds = (position, position + new Point(textures[0].Width, textures[0].Height)); + LoadPixelScaleMultiplier(); + } + + + public void SetTexture(int textureId) { + if (textureId >= textures.Count){ + Console.WriteLine($"WARNING: TEXTURE {textureId} OUT OF BOUNDS"); + return; + } + + currentTextureId = textureId; } public void Update() { @@ -35,6 +70,7 @@ public class UIElement { public virtual void OnMouseHold() { } public void Draw(SpriteBatch spriteBatch) { - texture.Draw(spriteBatch, bounds.Item1.ToVector2(), Color.White); + textures[currentTextureId].Draw(spriteBatch, bounds.Item1.ToVector2(), Color.White, 0, Vector2.Zero, pixelScaleMultiplier, SpriteEffects.None, 0); + // texture.Draw(spriteBatch, bounds.Item1.ToVector2(), Color.White); } } \ No newline at end of file diff --git a/FNAF_Clone/GUI/UIManager.cs b/FNAF_Clone/GUI/UIManager.cs new file mode 100644 index 0000000..eeede6a --- /dev/null +++ b/FNAF_Clone/GUI/UIManager.cs @@ -0,0 +1,64 @@ +using Microsoft.Xna.Framework; +using MonoGameLibrary; +using MonoGameLibrary.Graphics; + +namespace FNAF_Clone.GUI; + +public class UIManager { + + public static class ScreenTypes { + public const string OFFICE = "office"; + public const string CAMERAS = "monitor"; + } + + private static Screen officeScreen = new(ScreenTypes.OFFICE); + private static Screen monitorScreen = new(ScreenTypes.CAMERAS); + + private static TextureAtlas testAtlas; + private static TextureAtlas officeAtlas; + private static TextureAtlas monitorAtlas; + public static int GlobalPixelMultiplier{ get; private set; } + + public static void InitUI() { + GlobalPixelMultiplier = Core.graphicsDevice.Viewport.Height / 360; + + testAtlas = TextureAtlas.FromFile(Core.content, "images/testBlocks-definition.xml"); + officeAtlas = TextureAtlas.FromFile(Core.content, "images/office-definition.xml"); + monitorAtlas = TextureAtlas.FromFile(Core.content, "images/monitor-definition.xml"); + + Screen.AddScreens([officeScreen, monitorScreen]); + Screen.SetScreen(ScreenTypes.OFFICE); + + // officeScreen.AddElement("test", + // new UIElement(testAtlas[0], Point.Zero) + // {Pressable = true, OnMousePress = () => Console.WriteLine("Pressed!")} + // ); + + officeScreen.AddElement("office_left", new UIElement([officeAtlas[3], officeAtlas[0]], Point.Zero)); + officeScreen.AddElement("office_centre", new UIElement([officeAtlas[4], officeAtlas[1]], new Point(200, 0).MultiplyByScalar(GlobalPixelMultiplier))); + officeScreen.AddElement("office_right", new UIElement([officeAtlas[5], officeAtlas[2]], new Point(440, 0).MultiplyByScalar(GlobalPixelMultiplier))); + + monitorScreen.AddElement("screen", new UIElement(monitorAtlas[0], Point.Zero)); + monitorScreen.AddElement("view-frame", new UIElement(monitorAtlas[1], new Point(62, 55).MultiplyByScalar(GlobalPixelMultiplier))); + monitorScreen.AddElement("map-frame", new UIElement(monitorAtlas[2], new Point(334, 135).MultiplyByScalar(GlobalPixelMultiplier))); + monitorScreen.AddElement("map", new UIElement(monitorAtlas[3], new Point(334, 135).MultiplyByScalar(GlobalPixelMultiplier))); + } + + public static void ChangeDoorState(int id, bool state) { + switch (id){ + case 0: + officeScreen["office_left"].SetTexture(state ? 1 : 0); + break; + case 1: + officeScreen["office_centre"].SetTexture(state ? 1 : 0); + break; + case 2: + officeScreen["office_right"].SetTexture(state ? 1 : 0); + break; + } + } + + public static void ChangeMonitorState(bool state) { + Screen.SetScreen(state ? ScreenTypes.CAMERAS : ScreenTypes.OFFICE); + } +} \ No newline at end of file diff --git a/FNAF_Clone/GameMain.cs b/FNAF_Clone/GameMain.cs index b6076c9..e643bb8 100644 --- a/FNAF_Clone/GameMain.cs +++ b/FNAF_Clone/GameMain.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using FNAF_Clone.GUI; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -9,13 +10,11 @@ using MonoGameLibrary.Input; namespace FNAF_Clone; -public class GameMain() : Core("fnafkooo", 640, 360, false) { +public class GameMain() : Core("fnafkooo", 1920, 1080, 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); @@ -23,19 +22,14 @@ public class GameMain() : Core("fnafkooo", 640, 360, false) { InputManager.AddListener(InputManager.MouseButton.LEFT, (() => Console.WriteLine("LMB pressed at: " + InputManager.MouseState.Position)), InputTiming.PRESS, new InputListenerHook(true)); - base.Initialize(); + + UIManager.InitUI(); } protected override void LoadContent() { // spriteBatch = new SpriteBatch(GraphicsDevice); - testAtlas = TextureAtlas.FromFile(content, "images/testBlocks-definition.xml"); - - 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) { @@ -52,8 +46,8 @@ public class GameMain() : Core("fnafkooo", 640, 360, false) { } protected override void Draw(GameTime gameTime) { - GraphicsDevice.Clear(Color.CornflowerBlue); - spriteBatch.Begin(); + GraphicsDevice.Clear(Color.Black); + spriteBatch.Begin(samplerState:SamplerState.PointClamp); Screen.CurrentScreen.Draw(spriteBatch);