1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-20 14:15:23 +00: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:
Diego M 2018-11-25 15:13:24 -03:00 committed by Tim Sarbin
parent 6e7dccfe5d
commit cb8916c085
7 changed files with 160 additions and 8 deletions

View File

@ -8,6 +8,13 @@
Cancel,
// Game UI
Run,
Menu
Menu,
MinipanelCharacter,
MinipanelInventory,
MinipanelSkill,
MinipanelAutomap,
MinipanelMessage,
MinipanelQuest,
MinipanelMenu
}
}

View File

@ -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<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.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 } },
};

View File

@ -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";

View File

@ -83,6 +83,7 @@
<Compile Include="TextDictionary.cs" />
<Compile Include="UI\Button.cs" />
<Compile Include="UI\TextBox.cs" />
<Compile Include="UI\Minipanel.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenDiablo2.Common\OpenDiablo2.Common.csproj">
@ -94,4 +95,4 @@
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
</Project>

View File

@ -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);

View 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();
}
}
}

View File

@ -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
}*/
}
}
}