From f63a7b76e3daf8b2d8d1c726465409a7871bc323 Mon Sep 17 00:00:00 2001 From: Recrown Date: Thu, 22 Nov 2018 01:04:47 -0600 Subject: [PATCH] added untested nine patch system. --- RhythmBullet/Utilities/DataTypes/NinePatch.cs | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 RhythmBullet/Utilities/DataTypes/NinePatch.cs diff --git a/RhythmBullet/Utilities/DataTypes/NinePatch.cs b/RhythmBullet/Utilities/DataTypes/NinePatch.cs new file mode 100644 index 0000000..aefdad1 --- /dev/null +++ b/RhythmBullet/Utilities/DataTypes/NinePatch.cs @@ -0,0 +1,162 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RhythmBullet.Utilities.DataTypes +{ + public struct NinePatch + { + public Color color; + readonly Texture2D texture; + readonly int a, b, c, d; + private Rectangle sourceRectangle; + private Rectangle drawnRectangle; + + /// + /// A nine patch object. + /// + /// Texture used for the nine patch. Dimensions must be greater than their sum border counter parts. + /// Left side. + /// Right side. + /// Bottom side. + /// Top side. + public NinePatch(Texture2D texture, int a, int b, int c, int d) + { + this.texture = texture; + if (a + b >= texture.Width) throw new ArgumentOutOfRangeException("a and b cannot be greater than or equal to the width of texture."); + if (c + d >= texture.Height) throw new ArgumentOutOfRangeException("c and d cannot be greater or equal to the height of the texture."); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + + sourceRectangle = new Rectangle(); + drawnRectangle = new Rectangle(); + color = Color.White; + } + + public void Draw(SpriteBatch batch, Rectangle destination) + { + //1x1 + drawnRectangle.X = destination.X; + drawnRectangle.Y = destination.Y; + drawnRectangle.Width = a; + drawnRectangle.Height = c; + + sourceRectangle.X = 0; + sourceRectangle.Y = 0; + sourceRectangle.Width = a; + sourceRectangle.Height = c; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //2x1 + drawnRectangle.X = destination.X + a; + drawnRectangle.Y = destination.Y; + drawnRectangle.Width = destination.Width - a - b; + drawnRectangle.Height = c; + + sourceRectangle.X = a; + sourceRectangle.Y = 0; + sourceRectangle.Width = texture.Width - a - b; + sourceRectangle.Height = c; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //3x1 + drawnRectangle.X = destination.X + destination.Width - b; + drawnRectangle.Y = destination.Y; + drawnRectangle.Width = b; + drawnRectangle.Height = c; + + sourceRectangle.X = texture.Width - b; + sourceRectangle.Y = 0; + sourceRectangle.Width = b; + sourceRectangle.Height = c; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //1x2 + drawnRectangle.X = destination.X; + drawnRectangle.Y = destination.Y + c; + drawnRectangle.Width = a; + drawnRectangle.Height = destination.Height - d - c; + + sourceRectangle.X = 0; + sourceRectangle.Y = c; + sourceRectangle.Width = a; + sourceRectangle.Height = texture.Height - c - d; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //2x2 + drawnRectangle.X = destination.X + a; + drawnRectangle.Y = destination.Y + c; + drawnRectangle.Width = destination.Width - a - b; + drawnRectangle.Height = destination.Height - c - d; + + sourceRectangle.X = a; + sourceRectangle.Y = c; + sourceRectangle.Width = texture.Width - a - b; + sourceRectangle.Height = texture.Height - c - d; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //3x2 + drawnRectangle.X = destination.X + destination.Width - b; + drawnRectangle.Y = destination.Y + c; + drawnRectangle.Width = b; + drawnRectangle.Height = destination.Height - c - d; + + sourceRectangle.X = texture.Width - b; + sourceRectangle.Y = c; + sourceRectangle.Width = b; + sourceRectangle.Height = texture.Height - c - d; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //1x3 + drawnRectangle.X = destination.X; + drawnRectangle.Y = destination.Height - d; + drawnRectangle.Width = a; + drawnRectangle.Height = d; + + sourceRectangle.X = a; + sourceRectangle.Y = texture.Height - d; + sourceRectangle.Width = a; + sourceRectangle.Height = d; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //2x3 + drawnRectangle.X = destination.X + a; + drawnRectangle.Y = destination.Height - d; + drawnRectangle.Width = destination.Width - a - b; + drawnRectangle.Height = d; + + sourceRectangle.X = a; + sourceRectangle.Y = texture.Height - d; + sourceRectangle.Width = texture.Width - a - b; + sourceRectangle.Height = d; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + + //3x3 + drawnRectangle.X = destination.X + destination.Width - b; + drawnRectangle.Y = destination.Height - d; + drawnRectangle.Width = b; + drawnRectangle.Height = d; + + sourceRectangle.X = texture.Width - b; + sourceRectangle.Y = texture.Height - d; + sourceRectangle.Width = b; + sourceRectangle.Height = d; + + batch.Draw(texture, drawnRectangle, sourceRectangle, color); + } + } +}