diff --git a/OpenDiablo2.Common/Interfaces/IRenderWindow.cs b/OpenDiablo2.Common/Interfaces/IRenderWindow.cs index 9dec77f6..46ce4f4e 100644 --- a/OpenDiablo2.Common/Interfaces/IRenderWindow.cs +++ b/OpenDiablo2.Common/Interfaces/IRenderWindow.cs @@ -16,5 +16,6 @@ namespace OpenDiablo2.Common.Interfaces void Sync(); ISprite LoadSprite(ImageSet source); void Draw(ISprite sprite); + void Draw(ISprite sprite, int xSegments, int ySegments, int offset); } } diff --git a/OpenDiablo2.Core/OpenDiablo2.Core.csproj b/OpenDiablo2.Core/OpenDiablo2.Core.csproj index c3f8411c..9b87a6fa 100644 --- a/OpenDiablo2.Core/OpenDiablo2.Core.csproj +++ b/OpenDiablo2.Core/OpenDiablo2.Core.csproj @@ -86,8 +86,5 @@ - - - \ No newline at end of file diff --git a/OpenDiablo2.SDL2/SDL2RenderWindow.cs b/OpenDiablo2.SDL2/SDL2RenderWindow.cs index 592a4668..890446a0 100644 --- a/OpenDiablo2.SDL2/SDL2RenderWindow.cs +++ b/OpenDiablo2.SDL2/SDL2RenderWindow.cs @@ -103,6 +103,31 @@ namespace OpenDiablo2.SDL2_ } + public void Draw(ISprite sprite, int xSegments, int ySegments, int offset) + { + var spr = sprite as SDL2Sprite; + var segSize = xSegments * ySegments; + + for (var y = 0; y < ySegments; y++) + { + for (var x = 0; x < xSegments; x++) + { + var textureIndex = x + (y * xSegments) + (offset * xSegments * ySegments); + if (textureIndex >= spr.textures.Count()) + continue; + + var destRect = new SDL.SDL_Rect + { + x = sprite.Location.X + (x * 256), + y = sprite.Location.Y + (y * 256) - (int)(spr.FrameSize.Height - spr.source.Frames[textureIndex].Height), + w = spr.FrameSize.Width, + h = spr.FrameSize.Height + }; + SDL.SDL_RenderCopy(renderer, spr.textures[textureIndex], IntPtr.Zero, ref destRect); + } + } + } + public ISprite LoadSprite(ImageSet source) => new SDL2Sprite(source, renderer); } diff --git a/OpenDiablo2.SDL2/SDL2Sprite.cs b/OpenDiablo2.SDL2/SDL2Sprite.cs index d15230a9..9b3244f1 100644 --- a/OpenDiablo2.SDL2/SDL2Sprite.cs +++ b/OpenDiablo2.SDL2/SDL2Sprite.cs @@ -29,7 +29,7 @@ namespace OpenDiablo2.SDL2_ UpdateTextureData(); } } - private readonly ImageSet source; + internal readonly ImageSet source; private readonly IntPtr renderer; internal IntPtr[] textures = new IntPtr[0]; diff --git a/OpenDiablo2.Scenes/MainMenu.cs b/OpenDiablo2.Scenes/MainMenu.cs index 4dce7f27..b918be9d 100644 --- a/OpenDiablo2.Scenes/MainMenu.cs +++ b/OpenDiablo2.Scenes/MainMenu.cs @@ -41,6 +41,7 @@ namespace OpenDiablo2.Scenes //var texture = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\Logo\\logo.DC6"))); backgroundSprite = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\gameselectscreenEXP.dc6"))); backgroundSprite.CurrentPalette = paletteProvider.PaletteTable["Sky"]; + backgroundSprite.Location = new Point(0, 0); diabloLogoLeft = renderWindow.LoadSprite(ImageSet.LoadFromStream(mpqProvider.GetStream("data\\global\\ui\\FrontEnd\\D2logoFireLeft.DC6"))); diabloLogoLeft.CurrentPalette = paletteProvider.PaletteTable["Units"]; @@ -79,7 +80,7 @@ namespace OpenDiablo2.Scenes // TODO: Fake loading for now, this should be in its own scene as we start loading real stuff var r = new Random(); - for(int i = 1; i < 10; i++) + for (int i = 1; i < 10; i++) { renderWindow.Clear(); loadingSprite.Frame = i; @@ -96,16 +97,7 @@ namespace OpenDiablo2.Scenes { renderWindow.Clear(); - for (int y = 0; y < 3; y++) - { - for (int x = 0; x < 4; x++) - { - backgroundSprite.Frame = x + (y * 4); - backgroundSprite.Location = new Point(x * 256, ((y+1) * 256) - (backgroundSprite.FrameSize.Height - backgroundSprite.LocalFrameSize.Height)); - renderWindow.Draw(backgroundSprite); - } - - } + renderWindow.Draw(backgroundSprite, 4, 3, 0); diabloLogoLeftBlack.Frame = (int)((float)diabloLogoLeftBlack.TotalFrames * logoFrame); renderWindow.Draw(diabloLogoLeftBlack); @@ -117,13 +109,8 @@ namespace OpenDiablo2.Scenes diabloLogoRight.Frame = (int)((float)diabloLogoRight.TotalFrames * logoFrame); renderWindow.Draw(diabloLogoRight); - - wideButton.Location = new Point(260, 320); - wideButton.Frame = 0; - renderWindow.Draw(wideButton); - wideButton.Frame = 1; - wideButton.Location = new Point(260 + 256, 320); - renderWindow.Draw(wideButton); + wideButton.Location = new Point(264, 290); + renderWindow.Draw(wideButton, 2, 1, 0); mouseSprite.Location = new Point(mouseInfoProvider.MouseX, mouseInfoProvider.MouseY + mouseSprite.FrameSize.Height - 1); renderWindow.Draw(mouseSprite);