From cb8916c085e0c911eb31bde1de6ab7d1670d4a2f Mon Sep 17 00:00:00 2001 From: Diego M Date: Sun, 25 Nov 2018 15:13:24 -0300 Subject: [PATCH] UI: (Small) Minipanel Implementation (#15) * ui stuff * Toggleable stuff * Initial minipanel work * Partial work commit to fix random error, still missing relative rendering * Toggle Minipanel with HUD menu button * Fix line breaks --- OpenDiablo2.Common/Enums/eButtonType.cs | 9 +- OpenDiablo2.Common/Models/ButtonLayout.cs | 10 +++ OpenDiablo2.Common/ResourcePaths.cs | 3 + OpenDiablo2.Core/OpenDiablo2.Core.csproj | 3 +- OpenDiablo2.Core/UI/Button.cs | 20 ++++- OpenDiablo2.Core/UI/Minipanel.cs | 103 ++++++++++++++++++++++ OpenDiablo2.Scenes/Game.cs | 20 ++++- 7 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 OpenDiablo2.Core/UI/Minipanel.cs diff --git a/OpenDiablo2.Common/Enums/eButtonType.cs b/OpenDiablo2.Common/Enums/eButtonType.cs index b122d9f8..ab7815b0 100644 --- a/OpenDiablo2.Common/Enums/eButtonType.cs +++ b/OpenDiablo2.Common/Enums/eButtonType.cs @@ -8,6 +8,13 @@ Cancel, // Game UI Run, - Menu + Menu, + MinipanelCharacter, + MinipanelInventory, + MinipanelSkill, + MinipanelAutomap, + MinipanelMessage, + MinipanelQuest, + MinipanelMenu } } diff --git a/OpenDiablo2.Common/Models/ButtonLayout.cs b/OpenDiablo2.Common/Models/ButtonLayout.cs index 6aea0b52..7ea1e853 100644 --- a/OpenDiablo2.Common/Models/ButtonLayout.cs +++ b/OpenDiablo2.Common/Models/ButtonLayout.cs @@ -13,6 +13,7 @@ namespace OpenDiablo2.Common.Models public string ResourceName { get; internal set; } public string PaletteName { get; internal set; } public bool Toggleable { get; internal set; } = false; + public int BaseFrame { get; internal set; } = 0; public static Dictionary Values = new Dictionary { @@ -20,6 +21,15 @@ namespace OpenDiablo2.Common.Models {eButtonType.Medium, new ButtonLayout{ XSegments = 1, ResourceName=ResourcePaths.MediumButtonBlank, PaletteName = Palettes.Units } }, {eButtonType.Narrow, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.NarrowButtonBlank,PaletteName = Palettes.Units } }, {eButtonType.Cancel, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.CancelButton,PaletteName = Palettes.Units } }, + // Minipanel + {eButtonType.MinipanelCharacter, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 0 } }, + {eButtonType.MinipanelInventory, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 2 } }, + {eButtonType.MinipanelSkill, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 4 } }, + {eButtonType.MinipanelAutomap, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 8 } }, + {eButtonType.MinipanelMessage, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 10 } }, + {eButtonType.MinipanelQuest, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 12 } }, + {eButtonType.MinipanelMenu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MinipanelButton,PaletteName = Palettes.Units, BaseFrame = 14 } }, + {eButtonType.Run, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.RunButton,PaletteName = Palettes.Units, Toggleable = true } }, {eButtonType.Menu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MenuButton,PaletteName = Palettes.Units, Toggleable = true } }, }; diff --git a/OpenDiablo2.Common/ResourcePaths.cs b/OpenDiablo2.Common/ResourcePaths.cs index dbb8efdb..9828b0e0 100644 --- a/OpenDiablo2.Common/ResourcePaths.cs +++ b/OpenDiablo2.Common/ResourcePaths.cs @@ -104,6 +104,9 @@ namespace OpenDiablo2.Common public static string TextBox2 = "data\\global\\ui\\FrontEnd\\textbox2.dc6"; // --- GAME UI --- + public static string MinipanelSmall = "data\\global\\ui\\PANEL\\minipanel_s.dc6"; + public static string MinipanelButton = "data\\global\\ui\\PANEL\\minipanelbtn.DC6"; + public static string RunButton = "data\\global\\ui\\PANEL\\runbutton.dc6"; public static string MenuButton = "data\\global\\ui\\PANEL\\menubutton.DC6"; diff --git a/OpenDiablo2.Core/OpenDiablo2.Core.csproj b/OpenDiablo2.Core/OpenDiablo2.Core.csproj index 4c7d535b..a68dde61 100644 --- a/OpenDiablo2.Core/OpenDiablo2.Core.csproj +++ b/OpenDiablo2.Core/OpenDiablo2.Core.csproj @@ -83,6 +83,7 @@ + @@ -94,4 +95,4 @@ - \ No newline at end of file + diff --git a/OpenDiablo2.Core/UI/Button.cs b/OpenDiablo2.Core/UI/Button.cs index 71177c15..810f5c8f 100644 --- a/OpenDiablo2.Core/UI/Button.cs +++ b/OpenDiablo2.Core/UI/Button.cs @@ -108,6 +108,18 @@ namespace OpenDiablo2.Core.UI return toggled; } + public bool Toggle(bool isToggled) + { + if(toggled != isToggled) + { + OnToggle?.Invoke(isToggled); + + toggled = isToggled; + } + + return isToggled; + } + public void Update() { if (!enabled) @@ -164,19 +176,19 @@ namespace OpenDiablo2.Core.UI public void Render() { - var frame = 0; + var frame = buttonLayout.BaseFrame; if(toggled && pressed) { - frame = 3; + frame = buttonLayout.BaseFrame + 3; } else if(pressed) { - frame = 1; + frame = buttonLayout.BaseFrame + 1; } else if(toggled) { - frame = 2; + frame = buttonLayout.BaseFrame + 2; } renderWindow.Draw(sprite, buttonLayout.XSegments, 1, frame); diff --git a/OpenDiablo2.Core/UI/Minipanel.cs b/OpenDiablo2.Core/UI/Minipanel.cs new file mode 100644 index 00000000..a1771b90 --- /dev/null +++ b/OpenDiablo2.Core/UI/Minipanel.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenDiablo2.Common; +using OpenDiablo2.Common.Enums; +using OpenDiablo2.Common.Interfaces; + +namespace OpenDiablo2.Core.UI +{ + // TODO: Allow to set Minipanel.buttons.character.OnAction or similar for button delegates + public sealed class Minipanel : IDisposable + { + private readonly IRenderWindow renderWindow; + private ISprite sprite; + + private Button characterBtn, inventoryBtn, skillBtn, automapBtn, messageBtn, questBtn, menuBtn; + + private Point location = new Point(); + public Point Location + { + get => location; + set + { + if (location == value) + return; + location = value; + + sprite.Location = new Point(value.X, value.Y + sprite.LocalFrameSize.Height); + } + } + + public Minipanel(IRenderWindow renderWindow, Func createButton) + { + this.renderWindow = renderWindow; + + sprite = renderWindow.LoadSprite(ResourcePaths.MinipanelSmall, Palettes.Units); + Location = new Point(800/2-sprite.LocalFrameSize.Width/2, 526); + + characterBtn = createButton(eButtonType.MinipanelCharacter); + characterBtn.Location = new Point(3 + Location.X, 3 + Location.Y); + + inventoryBtn = createButton(eButtonType.MinipanelInventory); + inventoryBtn.Location = new Point(24 + Location.X, 3 + Location.Y); + + skillBtn = createButton(eButtonType.MinipanelSkill); + skillBtn.Location = new Point(45 + Location.X, 3 + Location.Y); + + automapBtn = createButton(eButtonType.MinipanelAutomap); + automapBtn.Location = new Point(66 + Location.X, 3 + Location.Y); + + messageBtn = createButton(eButtonType.MinipanelMessage); + messageBtn.Location = new Point(87 + Location.X, 3 + Location.Y); + + questBtn = createButton(eButtonType.MinipanelQuest); + questBtn.Location = new Point(108 + Location.X, 3 + Location.Y); + + menuBtn = createButton(eButtonType.MinipanelMenu); + menuBtn.Location = new Point(129 + Location.X, 3 + Location.Y); + } + + + public void Update() + { + characterBtn.Update(); + inventoryBtn.Update(); + skillBtn.Update(); + automapBtn.Update(); + messageBtn.Update(); + questBtn.Update(); + menuBtn.Update(); + + } + + public void Render() + { + renderWindow.Draw(sprite); + + characterBtn.Render(); + inventoryBtn.Render(); + skillBtn.Render(); + automapBtn.Render(); + messageBtn.Render(); + questBtn.Render(); + menuBtn.Render(); + } + + public void Dispose() + { + characterBtn.Dispose(); + inventoryBtn.Dispose(); + skillBtn.Dispose(); + automapBtn.Dispose(); + messageBtn.Dispose(); + questBtn.Dispose(); + menuBtn.Dispose(); + + sprite.Dispose(); + } + } +} diff --git a/OpenDiablo2.Scenes/Game.cs b/OpenDiablo2.Scenes/Game.cs index b0da078a..f4376f8f 100644 --- a/OpenDiablo2.Scenes/Game.cs +++ b/OpenDiablo2.Scenes/Game.cs @@ -28,6 +28,8 @@ namespace OpenDiablo2.Scenes private ISprite panelSprite, healthManaSprite, gameGlobeOverlapSprite; + private Minipanel minipanel; + private bool showMinipanel = false; private Button runButton, menuButton; public Game( @@ -50,6 +52,10 @@ namespace OpenDiablo2.Scenes healthManaSprite = renderWindow.LoadSprite(ResourcePaths.HealthMana, Palettes.Act1); gameGlobeOverlapSprite = renderWindow.LoadSprite(ResourcePaths.GameGlobeOverlap, Palettes.Act1); + minipanel = new Minipanel(renderWindow, createButton); + // Maybe? Not sure. + // miniPanel.OnMenuActivate(); + runButton = createButton(eButtonType.Run); runButton.Location = new Point(256, 570); runButton.OnToggle = OnRunToggle; @@ -61,7 +67,7 @@ namespace OpenDiablo2.Scenes private void OnMenuToggle(bool isToggled) { - log.Debug("Menu Toggle: " + isToggled); + this.showMinipanel = isToggled; } private void OnRunToggle(bool isToggled) @@ -101,12 +107,22 @@ namespace OpenDiablo2.Scenes renderWindow.Draw(healthManaSprite, 1, new Point(692, 588)); renderWindow.Draw(gameGlobeOverlapSprite, 1, new Point(693, 591)); + if(showMinipanel) + { + minipanel.Render(); + } + runButton.Render(); menuButton.Render(); } public void Update(long ms) { + if(showMinipanel) + { + minipanel.Update(); + } + runButton.Update(); menuButton.Update(); @@ -167,4 +183,4 @@ namespace OpenDiablo2.Scenes }*/ } -} +} \ No newline at end of file