mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-09-30 07:06:18 -04:00
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
This commit is contained in:
parent
6e7dccfe5d
commit
cb8916c085
@ -8,6 +8,13 @@
|
|||||||
Cancel,
|
Cancel,
|
||||||
// Game UI
|
// Game UI
|
||||||
Run,
|
Run,
|
||||||
Menu
|
Menu,
|
||||||
|
MinipanelCharacter,
|
||||||
|
MinipanelInventory,
|
||||||
|
MinipanelSkill,
|
||||||
|
MinipanelAutomap,
|
||||||
|
MinipanelMessage,
|
||||||
|
MinipanelQuest,
|
||||||
|
MinipanelMenu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ namespace OpenDiablo2.Common.Models
|
|||||||
public string ResourceName { get; internal set; }
|
public string ResourceName { get; internal set; }
|
||||||
public string PaletteName { get; internal set; }
|
public string PaletteName { get; internal set; }
|
||||||
public bool Toggleable { get; internal set; } = false;
|
public bool Toggleable { get; internal set; } = false;
|
||||||
|
public int BaseFrame { get; internal set; } = 0;
|
||||||
|
|
||||||
public static Dictionary<eButtonType, ButtonLayout> Values = new Dictionary<eButtonType, ButtonLayout>
|
public static Dictionary<eButtonType, ButtonLayout> Values = new Dictionary<eButtonType, ButtonLayout>
|
||||||
{
|
{
|
||||||
@ -20,6 +21,15 @@ namespace OpenDiablo2.Common.Models
|
|||||||
{eButtonType.Medium, new ButtonLayout{ XSegments = 1, ResourceName=ResourcePaths.MediumButtonBlank, PaletteName = Palettes.Units } },
|
{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.Narrow, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.NarrowButtonBlank,PaletteName = Palettes.Units } },
|
||||||
{eButtonType.Cancel, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.CancelButton,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.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 } },
|
{eButtonType.Menu, new ButtonLayout {XSegments = 1, ResourceName = ResourcePaths.MenuButton,PaletteName = Palettes.Units, Toggleable = true } },
|
||||||
};
|
};
|
||||||
|
@ -104,6 +104,9 @@ namespace OpenDiablo2.Common
|
|||||||
public static string TextBox2 = "data\\global\\ui\\FrontEnd\\textbox2.dc6";
|
public static string TextBox2 = "data\\global\\ui\\FrontEnd\\textbox2.dc6";
|
||||||
|
|
||||||
// --- GAME UI ---
|
// --- 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 RunButton = "data\\global\\ui\\PANEL\\runbutton.dc6";
|
||||||
public static string MenuButton = "data\\global\\ui\\PANEL\\menubutton.DC6";
|
public static string MenuButton = "data\\global\\ui\\PANEL\\menubutton.DC6";
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@
|
|||||||
<Compile Include="TextDictionary.cs" />
|
<Compile Include="TextDictionary.cs" />
|
||||||
<Compile Include="UI\Button.cs" />
|
<Compile Include="UI\Button.cs" />
|
||||||
<Compile Include="UI\TextBox.cs" />
|
<Compile Include="UI\TextBox.cs" />
|
||||||
|
<Compile Include="UI\Minipanel.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\OpenDiablo2.Common\OpenDiablo2.Common.csproj">
|
<ProjectReference Include="..\OpenDiablo2.Common\OpenDiablo2.Common.csproj">
|
||||||
|
@ -108,6 +108,18 @@ namespace OpenDiablo2.Core.UI
|
|||||||
return toggled;
|
return toggled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Toggle(bool isToggled)
|
||||||
|
{
|
||||||
|
if(toggled != isToggled)
|
||||||
|
{
|
||||||
|
OnToggle?.Invoke(isToggled);
|
||||||
|
|
||||||
|
toggled = isToggled;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isToggled;
|
||||||
|
}
|
||||||
|
|
||||||
public void Update()
|
public void Update()
|
||||||
{
|
{
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
@ -164,19 +176,19 @@ namespace OpenDiablo2.Core.UI
|
|||||||
|
|
||||||
public void Render()
|
public void Render()
|
||||||
{
|
{
|
||||||
var frame = 0;
|
var frame = buttonLayout.BaseFrame;
|
||||||
|
|
||||||
if(toggled && pressed)
|
if(toggled && pressed)
|
||||||
{
|
{
|
||||||
frame = 3;
|
frame = buttonLayout.BaseFrame + 3;
|
||||||
}
|
}
|
||||||
else if(pressed)
|
else if(pressed)
|
||||||
{
|
{
|
||||||
frame = 1;
|
frame = buttonLayout.BaseFrame + 1;
|
||||||
}
|
}
|
||||||
else if(toggled)
|
else if(toggled)
|
||||||
{
|
{
|
||||||
frame = 2;
|
frame = buttonLayout.BaseFrame + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderWindow.Draw(sprite, buttonLayout.XSegments, 1, frame);
|
renderWindow.Draw(sprite, buttonLayout.XSegments, 1, frame);
|
||||||
|
103
OpenDiablo2.Core/UI/Minipanel.cs
Normal file
103
OpenDiablo2.Core/UI/Minipanel.cs
Normal file
@ -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<eButtonType, Button> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,8 @@ namespace OpenDiablo2.Scenes
|
|||||||
|
|
||||||
private ISprite panelSprite, healthManaSprite, gameGlobeOverlapSprite;
|
private ISprite panelSprite, healthManaSprite, gameGlobeOverlapSprite;
|
||||||
|
|
||||||
|
private Minipanel minipanel;
|
||||||
|
private bool showMinipanel = false;
|
||||||
private Button runButton, menuButton;
|
private Button runButton, menuButton;
|
||||||
|
|
||||||
public Game(
|
public Game(
|
||||||
@ -50,6 +52,10 @@ namespace OpenDiablo2.Scenes
|
|||||||
healthManaSprite = renderWindow.LoadSprite(ResourcePaths.HealthMana, Palettes.Act1);
|
healthManaSprite = renderWindow.LoadSprite(ResourcePaths.HealthMana, Palettes.Act1);
|
||||||
gameGlobeOverlapSprite = renderWindow.LoadSprite(ResourcePaths.GameGlobeOverlap, Palettes.Act1);
|
gameGlobeOverlapSprite = renderWindow.LoadSprite(ResourcePaths.GameGlobeOverlap, Palettes.Act1);
|
||||||
|
|
||||||
|
minipanel = new Minipanel(renderWindow, createButton);
|
||||||
|
// Maybe? Not sure.
|
||||||
|
// miniPanel.OnMenuActivate();
|
||||||
|
|
||||||
runButton = createButton(eButtonType.Run);
|
runButton = createButton(eButtonType.Run);
|
||||||
runButton.Location = new Point(256, 570);
|
runButton.Location = new Point(256, 570);
|
||||||
runButton.OnToggle = OnRunToggle;
|
runButton.OnToggle = OnRunToggle;
|
||||||
@ -61,7 +67,7 @@ namespace OpenDiablo2.Scenes
|
|||||||
|
|
||||||
private void OnMenuToggle(bool isToggled)
|
private void OnMenuToggle(bool isToggled)
|
||||||
{
|
{
|
||||||
log.Debug("Menu Toggle: " + isToggled);
|
this.showMinipanel = isToggled;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnRunToggle(bool isToggled)
|
private void OnRunToggle(bool isToggled)
|
||||||
@ -101,12 +107,22 @@ namespace OpenDiablo2.Scenes
|
|||||||
renderWindow.Draw(healthManaSprite, 1, new Point(692, 588));
|
renderWindow.Draw(healthManaSprite, 1, new Point(692, 588));
|
||||||
renderWindow.Draw(gameGlobeOverlapSprite, 1, new Point(693, 591));
|
renderWindow.Draw(gameGlobeOverlapSprite, 1, new Point(693, 591));
|
||||||
|
|
||||||
|
if(showMinipanel)
|
||||||
|
{
|
||||||
|
minipanel.Render();
|
||||||
|
}
|
||||||
|
|
||||||
runButton.Render();
|
runButton.Render();
|
||||||
menuButton.Render();
|
menuButton.Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(long ms)
|
public void Update(long ms)
|
||||||
{
|
{
|
||||||
|
if(showMinipanel)
|
||||||
|
{
|
||||||
|
minipanel.Update();
|
||||||
|
}
|
||||||
|
|
||||||
runButton.Update();
|
runButton.Update();
|
||||||
menuButton.Update();
|
menuButton.Update();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user