161 lines
5.6 KiB
C#
161 lines
5.6 KiB
C#
|
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 class NinePatch
|
|||
|
{
|
|||
|
public Color color;
|
|||
|
readonly Texture2D texture;
|
|||
|
readonly int a, b, c, d;
|
|||
|
private Rectangle sourceRectangle;
|
|||
|
private Rectangle drawnRectangle;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// A nine patch object.
|
|||
|
/// </summary>
|
|||
|
/// <param name="texture">Texture used for the nine patch. Dimensions must be greater than their sum border counter parts.</param>
|
|||
|
/// <param name="a">Left side.</param>
|
|||
|
/// <param name="b">Right side.</param>
|
|||
|
/// <param name="c">Bottom side.</param>
|
|||
|
/// <param name="d">Top side.</param>
|
|||
|
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;
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|