using System; using System.Collections.Generic; using System.Drawing; using System.Runtime.Remoting.Messaging; namespace SpritePacker { public class Sprite { private Rectangle area; private string filename; private Image image; public bool Placed { get; set; } = false; public Rectangle Area { get { return area; } set { area = value; } } public string Filename { get { return filename; } set { filename = value; } } public Image Image { get { return image; } } public Point Location { get { return new Point(X, Y); } } public int X { get { return area.X; } set { area.X = value; } } public int Y { get { return area.Y; } set { area.Y = value; } } public int Width { get { return area.Width; } set { area.Width = value; } } public int Height { get { return area.Height; } set { area.Height = value; } } public int Top { get { return area.Top; } } public int Bottom { get { return area.Bottom; } } public int Left { get { return area.Left; } } public int Right { get { return area.Right; } } public int AreaSize { get { return area.Width * area.Height; } } public int MaxSideLength { get { return Math.Max(area.Width, area.Height); } } public Sprite(string inFilename) { Filename = inFilename; image = Image.FromFile(filename); Width = image.Width; Height = image.Height; } public static int GetLargestSize(List sprList) { int largestSoFar = 0; foreach(Sprite spr in sprList) { if (spr.Area.Width > largestSoFar) largestSoFar = spr.Area.Width; } return largestSoFar; } public List GetIntersectors(List spriteList) { List result = new List(); foreach(Sprite spr in spriteList) { if (spr == this) // Don't attempt to check for collisions with ourselves continue; if (spr.IntersectsWith(this)) result.Add(spr); } return result; } public List GetIntersectorsX(List spriteList) { List result = new List(); foreach(Sprite spr in spriteList) { if (spr.IntersectsWithX(this)) result.Add(spr); } return result; } public List GetIntersectorsY(List spriteList) { List result = new List(); foreach(Sprite spr in spriteList) { if (spr.IntersectsWithY(this)) result.Add(spr); } return result; } public bool IntersectsWith(List otherSprites) { foreach (Sprite spr in otherSprites) { if (IntersectsWith(spr)) return true; } return false; } public bool IntersectsWith(Sprite otherSprite) { return otherSprite.Area.IntersectsWith(Area); } public bool IntersectsWithX(List otherSprites) { foreach (Sprite spr in otherSprites) { if (IntersectsWithX(spr)) return true; } return false; } public bool IntersectsWithY(List otherSprites) { foreach (Sprite spr in otherSprites) { if (IntersectsWithY(spr)) return true; } return false; } public bool IntersectsWithX(Sprite otherSprite) { if(Area.Right > otherSprite.Area.X && Area.X < otherSprite.Area.Right) return true; else return false; } public bool IntersectsWithY(Sprite otherSprite) { if(Area.Bottom > otherSprite.Area.Y && Area.Y < otherSprite.Area.Bottom) return true; else return false; } public override string ToString() { return string.Format("Sprite {0} at {1}", Filename, Area); } } }