mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-06-12 18:50:42 +00:00
Added resource manager. Working on weird memory and performance things.
This commit is contained in:
parent
fcc3293aad
commit
245eabe4c2
8
OpenDiablo2.Common/Enums/eButtonType.cs
Normal file
8
OpenDiablo2.Common/Enums/eButtonType.cs
Normal file
|
@ -0,0 +1,8 @@
|
|||
namespace OpenDiablo2.Common.Enums
|
||||
{
|
||||
public enum eButtonType
|
||||
{
|
||||
Wide,
|
||||
Cancel
|
||||
}
|
||||
}
|
16
OpenDiablo2.Common/Interfaces/IResourceManager.cs
Normal file
16
OpenDiablo2.Common/Interfaces/IResourceManager.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OpenDiablo2.Common.Models;
|
||||
|
||||
namespace OpenDiablo2.Common.Interfaces
|
||||
{
|
||||
public interface IResourceManager
|
||||
{
|
||||
ImageSet GetImageSet(string resourcePath);
|
||||
MPQFont GetMPQFont(string resourcePath);
|
||||
Palette GetPalette(string paletteName);
|
||||
}
|
||||
}
|
23
OpenDiablo2.Common/Models/ButtonLayout.cs
Normal file
23
OpenDiablo2.Common/Models/ButtonLayout.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OpenDiablo2.Common.Enums;
|
||||
|
||||
namespace OpenDiablo2.Common.Models
|
||||
{
|
||||
public class ButtonLayout
|
||||
{
|
||||
public int XSegments { get; internal set; }
|
||||
public string ResourceName { get; internal set; }
|
||||
public string PaletteName { get; internal set; }
|
||||
|
||||
public static Dictionary<eButtonType, ButtonLayout> Values = new Dictionary<eButtonType, ButtonLayout>
|
||||
{
|
||||
{eButtonType.Wide, new ButtonLayout { XSegments = 2, ResourceName = ResourcePaths.WideButtonBlank, PaletteName = Palettes.Units } },
|
||||
{eButtonType.Cancel, new ButtonLayout {XSegments = 1,ResourceName = ResourcePaths.CancelButton,PaletteName = Palettes.Units } }
|
||||
};
|
||||
}
|
||||
|
||||
}
|
|
@ -9,7 +9,7 @@ using System.Threading.Tasks;
|
|||
namespace OpenDiablo2.Common.Models
|
||||
{
|
||||
|
||||
public class ImageFrame
|
||||
public class ImageFrame : IDisposable
|
||||
{
|
||||
public UInt32 Flip;
|
||||
public UInt32 Width;
|
||||
|
@ -21,6 +21,11 @@ namespace OpenDiablo2.Common.Models
|
|||
public UInt32 Length;
|
||||
public Int16[,] ImageData;
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
ImageData = new Int16[0, 0];
|
||||
}
|
||||
|
||||
public Color GetColor(int x, int y, Palette palette)
|
||||
{
|
||||
var index = ImageData[x, y];
|
||||
|
@ -33,7 +38,7 @@ namespace OpenDiablo2.Common.Models
|
|||
}
|
||||
}
|
||||
|
||||
public sealed class ImageSet
|
||||
public sealed class ImageSet : IDisposable
|
||||
{
|
||||
static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
|
@ -112,7 +117,6 @@ namespace OpenDiablo2.Common.Models
|
|||
continue;
|
||||
}
|
||||
|
||||
|
||||
for (int p = 0; p < b; p++)
|
||||
{
|
||||
result.Frames[i].ImageData[x++, y] = br.ReadByte();
|
||||
|
@ -122,5 +126,9 @@ namespace OpenDiablo2.Common.Models
|
|||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,16 +85,18 @@ namespace OpenDiablo2.Common.Models
|
|||
|
||||
private List<string> GetFilePaths()
|
||||
{
|
||||
var stream = OpenFile("(listfile)");
|
||||
if (stream == null)
|
||||
using (var stream = OpenFile("(listfile)"))
|
||||
{
|
||||
return new List<string>();
|
||||
if (stream == null)
|
||||
{
|
||||
return new List<string>();
|
||||
}
|
||||
|
||||
var sr = new StreamReader(stream);
|
||||
var text = sr.ReadToEnd();
|
||||
|
||||
return text.Split('\n').Where(x => !String.IsNullOrWhiteSpace(x)).Select(x => x.Trim()).ToList();
|
||||
}
|
||||
|
||||
var sr = new StreamReader(stream);
|
||||
var text = sr.ReadToEnd();
|
||||
|
||||
return text.Split('\n').Where(x => !String.IsNullOrWhiteSpace(x)).Select(x => x.Trim()).ToList();
|
||||
}
|
||||
|
||||
static MPQ()
|
||||
|
|
|
@ -70,6 +70,7 @@
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Attributes\SceneAttribute.cs" />
|
||||
<Compile Include="Enums\eButtonType.cs" />
|
||||
<Compile Include="Enums\eMPQFormatVersion.cs" />
|
||||
<Compile Include="Interfaces\IFont.cs" />
|
||||
<Compile Include="Interfaces\IGameEngine.cs" />
|
||||
|
@ -79,12 +80,14 @@
|
|||
<Compile Include="Interfaces\IPaletteProvider.cs" />
|
||||
<Compile Include="Interfaces\IRenderTarget.cs" />
|
||||
<Compile Include="Interfaces\IRenderWindow.cs" />
|
||||
<Compile Include="Interfaces\IResourceManager.cs" />
|
||||
<Compile Include="Interfaces\IScene.cs" />
|
||||
<Compile Include="Interfaces\ISceneManager.cs" />
|
||||
<Compile Include="Interfaces\ISprite.cs" />
|
||||
<Compile Include="Interfaces\IMouseInfoProvider.cs" />
|
||||
<Compile Include="Interfaces\ITextLabel.cs" />
|
||||
<Compile Include="Models\BitStream.cs" />
|
||||
<Compile Include="Models\ButtonLayout.cs" />
|
||||
<Compile Include="Models\MPQFont.cs" />
|
||||
<Compile Include="Models\GlobalConfiguration.cs" />
|
||||
<Compile Include="Models\ImageSet.cs" />
|
||||
|
|
|
@ -40,6 +40,7 @@ namespace OpenDiablo2.Common
|
|||
|
||||
// --- UI ---
|
||||
public static string WideButtonBlank = "data\\global\\ui\\FrontEnd\\WideButtonBlank.dc6";
|
||||
public static string CancelButton = "data\\global\\ui\\FrontEnd\\CancelButtonBlank.dc6";
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,9 @@ namespace OpenDiablo2.Core
|
|||
|
||||
builder.RegisterType<GameEngine>().AsImplementedInterfaces().SingleInstance();
|
||||
builder.RegisterType<MPQProvider>().As<IMPQProvider>().SingleInstance();
|
||||
builder.RegisterType<ResourceManager>().As<IResourceManager>().SingleInstance();
|
||||
|
||||
builder.RegisterType<WideButton>().AsSelf().InstancePerDependency();
|
||||
builder.RegisterType<Button>().AsSelf().InstancePerDependency();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@ namespace OpenDiablo2.Core
|
|||
private readonly Func<IRenderWindow> getRenderWindow;
|
||||
private readonly Func<IMouseInfoProvider> getMouseInfoProvider;
|
||||
private readonly Func<string, IScene> getScene;
|
||||
private readonly Func<IResourceManager> getResourceManager;
|
||||
|
||||
private IScene currentScene;
|
||||
private IScene nextScene = null;
|
||||
private ISprite mouseSprite;
|
||||
|
@ -35,13 +37,15 @@ namespace OpenDiablo2.Core
|
|||
IMPQProvider mpqProvider,
|
||||
Func<IRenderWindow> getRenderWindow,
|
||||
Func<IMouseInfoProvider> getMouseInfoProvider,
|
||||
Func<string, IScene> getScene
|
||||
Func<string, IScene> getScene,
|
||||
Func<IResourceManager> getResourceManager
|
||||
)
|
||||
{
|
||||
this.mpqProvider = mpqProvider;
|
||||
this.getRenderWindow = getRenderWindow;
|
||||
this.getMouseInfoProvider = getMouseInfoProvider;
|
||||
this.getScene = getScene;
|
||||
this.getResourceManager = getResourceManager;
|
||||
|
||||
MPQs = mpqProvider.GetMPQs().ToArray();
|
||||
}
|
||||
|
@ -54,7 +58,7 @@ namespace OpenDiablo2.Core
|
|||
{
|
||||
var paletteNameParts = paletteFile.Split('\\');
|
||||
var paletteName = paletteNameParts[paletteNameParts.Count() - 2];
|
||||
PaletteTable[paletteName] = Palette.LoadFromStream(mpqProvider.GetStream(paletteFile), paletteName);
|
||||
PaletteTable[paletteName] = getResourceManager().GetPalette(paletteFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,6 +85,8 @@ namespace OpenDiablo2.Core
|
|||
|
||||
mouseSprite = renderWindow.LoadSprite(ResourcePaths.CursorDefault, Palettes.Units);
|
||||
|
||||
|
||||
|
||||
currentScene = getScene("Main Menu");
|
||||
sw.Start();
|
||||
while (getRenderWindow().IsRunning)
|
||||
|
@ -101,7 +107,6 @@ namespace OpenDiablo2.Core
|
|||
currentScene.Update(ms);
|
||||
if (nextScene!= null)
|
||||
{
|
||||
currentScene.Dispose();
|
||||
currentScene = nextScene;
|
||||
nextScene = null;
|
||||
continue;
|
||||
|
|
|
@ -76,7 +76,8 @@
|
|||
<Compile Include="GameEngine.cs" />
|
||||
<Compile Include="MPQProvider.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="UI\WideButton.cs" />
|
||||
<Compile Include="ResourceManager.cs" />
|
||||
<Compile Include="UI\Button.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\OpenDiablo2.Common\OpenDiablo2.Common.csproj">
|
||||
|
|
53
OpenDiablo2.Core/ResourceManager.cs
Normal file
53
OpenDiablo2.Core/ResourceManager.cs
Normal file
|
@ -0,0 +1,53 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using OpenDiablo2.Common.Interfaces;
|
||||
using OpenDiablo2.Common.Models;
|
||||
|
||||
namespace OpenDiablo2.Core
|
||||
{
|
||||
public sealed class ResourceManager : IResourceManager
|
||||
{
|
||||
private readonly IMPQProvider mpqProvider;
|
||||
private Dictionary<string, ImageSet> ImageSets = new Dictionary<string, ImageSet>();
|
||||
private Dictionary<string, MPQFont> MPQFonts = new Dictionary<string, MPQFont>();
|
||||
private Dictionary<string, Palette> Palettes = new Dictionary<string, Palette>();
|
||||
|
||||
public ResourceManager(IMPQProvider mpqProvider)
|
||||
{
|
||||
this.mpqProvider = mpqProvider;
|
||||
}
|
||||
|
||||
public ImageSet GetImageSet(string resourcePath)
|
||||
{
|
||||
if (!ImageSets.ContainsKey(resourcePath))
|
||||
ImageSets[resourcePath] = ImageSet.LoadFromStream(mpqProvider.GetStream(resourcePath));
|
||||
|
||||
return ImageSets[resourcePath];
|
||||
}
|
||||
|
||||
public MPQFont GetMPQFont(string resourcePath)
|
||||
{
|
||||
if (!MPQFonts.ContainsKey(resourcePath))
|
||||
MPQFonts[resourcePath] = MPQFont.LoadFromStream(mpqProvider.GetStream($"{resourcePath}.DC6"), mpqProvider.GetStream($"{resourcePath}.tbl"));
|
||||
|
||||
return MPQFonts[resourcePath];
|
||||
}
|
||||
|
||||
public Palette GetPalette(string paletteFile)
|
||||
{
|
||||
if (!Palettes.ContainsKey(paletteFile))
|
||||
{
|
||||
var paletteNameParts = paletteFile.Split('\\');
|
||||
var paletteName = paletteNameParts[paletteNameParts.Count() - 2];
|
||||
Palettes[paletteFile] = Palette.LoadFromStream(mpqProvider.GetStream(paletteFile), paletteName);
|
||||
}
|
||||
|
||||
return Palettes[paletteFile];
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
using OpenDiablo2.Common;
|
||||
using OpenDiablo2.Common.Interfaces;
|
||||
using OpenDiablo2.Common.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
|
@ -9,10 +10,13 @@ using System.Threading.Tasks;
|
|||
|
||||
namespace OpenDiablo2.Core.UI
|
||||
{
|
||||
public sealed class WideButton
|
||||
|
||||
|
||||
public sealed class Button : IDisposable
|
||||
{
|
||||
private readonly IMouseInfoProvider mouseInfoProvider;
|
||||
private readonly IRenderWindow renderWindow;
|
||||
private readonly ButtonLayout buttonLayout;
|
||||
|
||||
public delegate void OnActivateDelegate();
|
||||
public OnActivateDelegate OnActivate { get; set; }
|
||||
|
@ -28,7 +32,7 @@ namespace OpenDiablo2.Core.UI
|
|||
}
|
||||
}
|
||||
|
||||
private readonly int buttonWidth, buttonHeight;
|
||||
private int buttonWidth, buttonHeight;
|
||||
private ISprite sprite;
|
||||
private IFont font;
|
||||
private ILabel label;
|
||||
|
@ -36,7 +40,7 @@ namespace OpenDiablo2.Core.UI
|
|||
private bool active = false; // When true, button is actively being focus pressed
|
||||
private bool activeLock = false; // When true, something else is being pressed so ignore everything
|
||||
private Point labelOffset = new Point();
|
||||
|
||||
|
||||
private string text;
|
||||
public string Text
|
||||
{
|
||||
|
@ -48,22 +52,32 @@ namespace OpenDiablo2.Core.UI
|
|||
}
|
||||
}
|
||||
|
||||
public WideButton(IRenderWindow renderWindow, IMouseInfoProvider mouseInfoProvider)
|
||||
|
||||
public Button(
|
||||
ButtonLayout buttonLayout,
|
||||
IRenderWindow renderWindow,
|
||||
IMouseInfoProvider mouseInfoProvider
|
||||
)
|
||||
{
|
||||
this.buttonLayout = buttonLayout;
|
||||
this.renderWindow = renderWindow;
|
||||
this.mouseInfoProvider = mouseInfoProvider;
|
||||
|
||||
sprite = renderWindow.LoadSprite(ResourcePaths.WideButtonBlank, Palettes.Units);
|
||||
font = renderWindow.LoadFont(ResourcePaths.FontExocet10, Palettes.Units);
|
||||
label = renderWindow.CreateLabel(font);
|
||||
|
||||
// TODO: Less stupid way of doing this would be nice
|
||||
sprite.Frame = 0;
|
||||
buttonWidth = sprite.LocalFrameSize.Width;
|
||||
buttonHeight = sprite.LocalFrameSize.Height;
|
||||
sprite.Frame = 1;
|
||||
buttonWidth += sprite.LocalFrameSize.Width;
|
||||
|
||||
sprite = renderWindow.LoadSprite(buttonLayout.ResourceName, buttonLayout.PaletteName);
|
||||
|
||||
// TODO: Less stupid way of doing this would be nice
|
||||
buttonWidth = 0;
|
||||
buttonHeight = 0;
|
||||
for (int i = 0; i < buttonLayout.XSegments; i++)
|
||||
{
|
||||
sprite.Frame = i;
|
||||
buttonWidth += sprite.LocalFrameSize.Width;
|
||||
buttonHeight = Math.Max(buttonHeight, sprite.LocalFrameSize.Height);
|
||||
}
|
||||
}
|
||||
|
||||
public void Update()
|
||||
|
@ -101,7 +115,7 @@ namespace OpenDiablo2.Core.UI
|
|||
|
||||
public void Render()
|
||||
{
|
||||
renderWindow.Draw(sprite, 2, 1, pressed ? 1 : 0);
|
||||
renderWindow.Draw(sprite, buttonLayout.XSegments, 1, pressed ? 1 : 0);
|
||||
var offset = pressed ? -3 : 0;
|
||||
|
||||
label.Location = new Point(location.X + offset + labelOffset.X, location.Y - offset + labelOffset.Y);
|
||||
|
@ -116,5 +130,12 @@ namespace OpenDiablo2.Core.UI
|
|||
var offsetX = (buttonWidth / 2) - (label.TextArea.Width / 2);
|
||||
labelOffset = new Point(offsetX, -5);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
sprite.Dispose();
|
||||
font.Dispose();
|
||||
label.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12,6 +12,8 @@ namespace OpenDiablo2.SDL2_
|
|||
{
|
||||
internal sealed class SDL2Label : ILabel
|
||||
{
|
||||
static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private readonly SDL2Font font;
|
||||
private readonly IntPtr renderer;
|
||||
internal IntPtr texture;
|
||||
|
|
|
@ -27,14 +27,17 @@ namespace OpenDiablo2.SDL2_
|
|||
|
||||
private readonly IMPQProvider mpqProvider;
|
||||
private readonly IPaletteProvider paletteProvider;
|
||||
private readonly IResourceManager resourceManager;
|
||||
|
||||
public SDL2RenderWindow(
|
||||
IMPQProvider mpqProvider,
|
||||
IPaletteProvider paletteProvider
|
||||
IPaletteProvider paletteProvider,
|
||||
IResourceManager resourceManager
|
||||
)
|
||||
{
|
||||
this.mpqProvider = mpqProvider;
|
||||
this.paletteProvider = paletteProvider;
|
||||
this.resourceManager = resourceManager;
|
||||
|
||||
SDL.SDL_Init(SDL.SDL_INIT_EVERYTHING);
|
||||
if (SDL.SDL_SetHint(SDL.SDL_HINT_RENDER_SCALE_QUALITY, "0") == SDL.SDL_bool.SDL_FALSE)
|
||||
|
@ -178,7 +181,7 @@ namespace OpenDiablo2.SDL2_
|
|||
public ISprite LoadSprite(string resourcePath, string palette) => LoadSprite(resourcePath, palette, Point.Empty);
|
||||
public ISprite LoadSprite(string resourcePath, string palette, Point location)
|
||||
{
|
||||
var result = new SDL2Sprite(ImageSet.LoadFromStream(mpqProvider.GetStream(resourcePath)), renderer)
|
||||
var result = new SDL2Sprite(resourceManager.GetImageSet(resourcePath), renderer)
|
||||
{
|
||||
CurrentPalette = paletteProvider.PaletteTable[palette],
|
||||
Location = location
|
||||
|
@ -188,7 +191,7 @@ namespace OpenDiablo2.SDL2_
|
|||
|
||||
public IFont LoadFont(string resourcePath, string palette)
|
||||
{
|
||||
var result = new SDL2Font(MPQFont.LoadFromStream(mpqProvider.GetStream($"{resourcePath}.DC6"), mpqProvider.GetStream($"{resourcePath}.tbl")), renderer)
|
||||
var result = new SDL2Font(resourceManager.GetMPQFont(resourcePath), renderer)
|
||||
{
|
||||
CurrentPalette = paletteProvider.PaletteTable[palette]
|
||||
};
|
||||
|
|
|
@ -134,7 +134,6 @@ namespace OpenDiablo2.SDL2_
|
|||
{
|
||||
SDL.SDL_DestroyTexture(texture);
|
||||
}
|
||||
textures = new IntPtr[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,7 @@
|
|||
using Autofac;
|
||||
using System.Linq;
|
||||
using Autofac;
|
||||
using OpenDiablo2.Common.Attributes;
|
||||
using OpenDiablo2.Common.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace OpenDiablo2.Scenes
|
||||
{
|
||||
|
@ -24,7 +20,7 @@ namespace OpenDiablo2.Scenes
|
|||
builder
|
||||
.RegisterType(type)
|
||||
.Keyed<IScene>(att.SceneName)
|
||||
.InstancePerDependency();
|
||||
.SingleInstance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using OpenDiablo2.Common;
|
||||
using OpenDiablo2.Common.Attributes;
|
||||
using OpenDiablo2.Common.Enums;
|
||||
using OpenDiablo2.Common.Interfaces;
|
||||
using OpenDiablo2.Common.Models;
|
||||
using OpenDiablo2.Core.UI;
|
||||
|
@ -29,7 +30,7 @@ namespace OpenDiablo2.Scenes
|
|||
private ISprite backgroundSprite, diabloLogoLeft, diabloLogoRight, diabloLogoLeftBlack, diabloLogoRightBlack;
|
||||
private IFont labelFont;
|
||||
private ILabel versionLabel, urlLabel;
|
||||
private WideButton btnSinglePlayer, btnExit, btnWebsite;
|
||||
private Button btnSinglePlayer, btnExit, btnWebsite;
|
||||
|
||||
public MainMenu(
|
||||
IRenderWindow renderWindow,
|
||||
|
@ -38,7 +39,7 @@ namespace OpenDiablo2.Scenes
|
|||
IMouseInfoProvider mouseInfoProvider,
|
||||
IMusicProvider musicProvider,
|
||||
ISceneManager sceneManager,
|
||||
Func<WideButton> createWideButton
|
||||
Func<eButtonType, Button> createButton
|
||||
)
|
||||
{
|
||||
this.renderWindow = renderWindow;
|
||||
|
@ -55,17 +56,17 @@ namespace OpenDiablo2.Scenes
|
|||
diabloLogoLeftBlack = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoBlackLeft, Palettes.Units, new Point(400, 120));
|
||||
diabloLogoRightBlack = renderWindow.LoadSprite(ResourcePaths.Diablo2LogoBlackRight, Palettes.Units, new Point(400, 120));
|
||||
|
||||
btnSinglePlayer = createWideButton();
|
||||
btnSinglePlayer = createButton(eButtonType.Wide);
|
||||
btnSinglePlayer.Text = "Single Player".ToUpper();
|
||||
btnSinglePlayer.Location = new Point(264, 290);
|
||||
btnSinglePlayer.OnActivate = OnSinglePlayerClicked;
|
||||
|
||||
btnWebsite = createWideButton();
|
||||
btnWebsite.Text = "Visible Github".ToUpper();
|
||||
btnWebsite = createButton(eButtonType.Wide);
|
||||
btnWebsite.Text = "Visit Github".ToUpper();
|
||||
btnWebsite.Location = new Point(264, 460);
|
||||
btnWebsite.OnActivate = OnVisitWebsiteClicked;
|
||||
|
||||
btnExit = createWideButton();
|
||||
btnExit = createButton(eButtonType.Wide);
|
||||
btnExit.Text = "Exit Diablo II".ToUpper();
|
||||
btnExit.Location = new Point(264, 500);
|
||||
btnExit.OnActivate = OnExitClicked;
|
||||
|
@ -142,7 +143,17 @@ namespace OpenDiablo2.Scenes
|
|||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
backgroundSprite.Dispose();
|
||||
diabloLogoLeft.Dispose();
|
||||
diabloLogoRight.Dispose();
|
||||
diabloLogoLeftBlack.Dispose();
|
||||
diabloLogoRightBlack.Dispose();
|
||||
labelFont.Dispose();
|
||||
versionLabel.Dispose();
|
||||
urlLabel.Dispose();
|
||||
btnSinglePlayer.Dispose();
|
||||
btnExit.Dispose();
|
||||
btnWebsite.Dispose();
|
||||
}
|
||||
|
||||
private void OnSinglePlayerClicked()
|
||||
|
|
|
@ -5,7 +5,9 @@ using System.Text;
|
|||
using System.Threading.Tasks;
|
||||
using OpenDiablo2.Common;
|
||||
using OpenDiablo2.Common.Attributes;
|
||||
using OpenDiablo2.Common.Enums;
|
||||
using OpenDiablo2.Common.Interfaces;
|
||||
using OpenDiablo2.Core.UI;
|
||||
|
||||
namespace OpenDiablo2.Scenes
|
||||
{
|
||||
|
@ -25,6 +27,7 @@ namespace OpenDiablo2.Scenes
|
|||
private ISprite backgroundSprite, campfireSprite;
|
||||
private IFont headingFont;
|
||||
private ILabel headingLabel;
|
||||
private Button exitButton;
|
||||
|
||||
public SelectHeroClass(
|
||||
IRenderWindow renderWindow,
|
||||
|
@ -32,7 +35,8 @@ namespace OpenDiablo2.Scenes
|
|||
IMPQProvider mpqProvider,
|
||||
IMouseInfoProvider mouseInfoProvider,
|
||||
IMusicProvider musicProvider,
|
||||
ISceneManager sceneManager
|
||||
ISceneManager sceneManager,
|
||||
Func<eButtonType, Button> createButton
|
||||
)
|
||||
{
|
||||
this.renderWindow = renderWindow;
|
||||
|
@ -49,14 +53,23 @@ namespace OpenDiablo2.Scenes
|
|||
headingLabel.Text = "Select Hero Class";
|
||||
headingLabel.Location = new System.Drawing.Point(400 - (headingLabel.TextArea.Width / 2), 20);
|
||||
|
||||
exitButton = createButton(eButtonType.Cancel);
|
||||
exitButton.Text = "EXIT";
|
||||
exitButton.Location = new System.Drawing.Point(30, 550);
|
||||
exitButton.OnActivate = OnExitClicked;
|
||||
}
|
||||
|
||||
private void OnExitClicked()
|
||||
{
|
||||
sceneManager.ChangeScene("Main Menu");
|
||||
}
|
||||
|
||||
public void Render()
|
||||
{
|
||||
renderWindow.Draw(backgroundSprite, 4, 3, 0);
|
||||
renderWindow.Draw(campfireSprite, (int)(campfireSprite.TotalFrames * secondTimer));
|
||||
//renderWindow.Draw(headingLabel);
|
||||
renderWindow.Draw(headingLabel);
|
||||
exitButton.Render();
|
||||
}
|
||||
|
||||
public void Update(long ms)
|
||||
|
@ -66,11 +79,15 @@ namespace OpenDiablo2.Scenes
|
|||
while (secondTimer >= 1f)
|
||||
secondTimer -= 1f;
|
||||
|
||||
exitButton.Update();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
backgroundSprite.Dispose();
|
||||
campfireSprite.Dispose();
|
||||
headingFont.Dispose();
|
||||
headingLabel.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,4 +46,10 @@ Global
|
|||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {782826E1-7E8E-4878-88FB-1B564D82C621}
|
||||
EndGlobalSection
|
||||
GlobalSection(Performance) = preSolution
|
||||
HasPerformanceSessions = true
|
||||
EndGlobalSection
|
||||
GlobalSection(Performance) = preSolution
|
||||
HasPerformanceSessions = true
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{2B0CF1AC-06DD-4322-AE8B-FF8A8C70A3CD}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>OpenDiablo2</RootNamespace>
|
||||
<AssemblyName>OpenDiablo2</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
|
@ -52,6 +52,9 @@
|
|||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject />
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Autofac, Version=4.8.1.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Autofac.4.8.1\lib\net45\Autofac.dll</HintPath>
|
||||
|
|
|
@ -10,23 +10,32 @@ using OpenDiablo2.Common.Models;
|
|||
using System.Reflection;
|
||||
using OpenDiablo2.Common.Interfaces;
|
||||
using System.Diagnostics;
|
||||
using OpenDiablo2.Core.UI;
|
||||
using OpenDiablo2.Common.Enums;
|
||||
|
||||
namespace OpenDiablo2
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private static GlobalConfiguration globalConfiguration;
|
||||
static void Main(string[] args)
|
||||
{
|
||||
log.Info("OpenDiablo 2: The Free and Open Source Diablo 2 clone!");
|
||||
|
||||
Parser.Default.ParseArguments<CommandLineOptions>(args).WithParsed<CommandLineOptions>(o =>
|
||||
{
|
||||
globalConfiguration = new GlobalConfiguration
|
||||
{
|
||||
BaseDataPath = Path.GetFullPath(o.DataPath ?? Directory.GetCurrentDirectory())
|
||||
};
|
||||
});
|
||||
|
||||
#if !DEBUG
|
||||
try
|
||||
{
|
||||
#endif
|
||||
BuildContainer()
|
||||
.ResolveCommandLineOptions(args)
|
||||
.Resolve<IGameEngine>()
|
||||
.Run();
|
||||
#if !DEBUG
|
||||
|
@ -44,21 +53,12 @@ namespace OpenDiablo2
|
|||
.Build();
|
||||
|
||||
|
||||
static IContainer ResolveCommandLineOptions(this IContainer container, IEnumerable<string> args)
|
||||
{
|
||||
var globalConfiguration = container.Resolve<GlobalConfiguration>();
|
||||
|
||||
Parser.Default.ParseArguments<CommandLineOptions>(args).WithParsed<CommandLineOptions>(o =>
|
||||
{
|
||||
globalConfiguration.BaseDataPath = Path.GetFullPath(o.DataPath ?? Directory.GetCurrentDirectory());
|
||||
});
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
static ContainerBuilder RegisterLocalTypes(this ContainerBuilder containerBuilder)
|
||||
{
|
||||
containerBuilder.RegisterType<GlobalConfiguration>().AsSelf().SingleInstance();
|
||||
containerBuilder.Register<GlobalConfiguration>(x =>
|
||||
{
|
||||
return globalConfiguration;
|
||||
}).AsSelf().SingleInstance();
|
||||
|
||||
containerBuilder.Register<Func<string, IScene>>(c =>
|
||||
{
|
||||
|
@ -66,12 +66,18 @@ namespace OpenDiablo2
|
|||
return (sceneName) => componentContext.ResolveKeyed<IScene>(sceneName);
|
||||
});
|
||||
|
||||
containerBuilder.Register<Func<eButtonType, Button>>(c =>
|
||||
{
|
||||
var componentContext = c.Resolve<IComponentContext>();
|
||||
return (buttonType) => componentContext.Resolve<Button>(new NamedParameter("buttonLayout", ButtonLayout.Values[buttonType]));
|
||||
});
|
||||
|
||||
return containerBuilder;
|
||||
}
|
||||
|
||||
static ContainerBuilder LoadAssemblyModules(this ContainerBuilder containerBuilder)
|
||||
{
|
||||
var filesToLoad = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll");
|
||||
var filesToLoad = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll").Where(x => Path.GetFileName(x).StartsWith("OpenDiablo2."));
|
||||
foreach (var file in filesToLoad)
|
||||
{
|
||||
try
|
||||
|
|
Loading…
Reference in New Issue
Block a user