using System; using System.Diagnostics; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace isometricparkfna { public struct Edge { public Vector2 Start; public Vector2 End; public static bool operator == (Edge left, Edge right) { return (left.Start == right.Start && left.End == right.End) || (left.Start == right.End && left.End == right.Start); } public static bool operator != (Edge left, Edge right) { return !(left == right); } public override bool Equals(Object other) { return ((other != null) && this.GetType().Equals(other.GetType()) && this == (Edge)other); //we just confirmed the types match so this is okay } public override int GetHashCode() { return (Start, End).GetHashCode(); } } public class Tile { //blatantly stolen from XNA resources.com static public int TileWidth = 64; static public int TileHeight = 64; // static public int TileStepX = 64; // static public int TileStepY = 16; //static public int OddRowXOffset = 32; static public int TileSpriteWidth = 64; static public int TileSpriteHeight = 32; static public Texture2D TileSetTexture; public const float DEPTH = 0.79f; public Tile() { } static public Rectangle GetSourceRectangle(int tileIndex) { int tileY = tileIndex / (TileSetTexture.Width / TileWidth); int tileX = tileIndex % (TileSetTexture.Width / TileWidth); return new Rectangle(tileX * TileWidth, tileY * TileHeight, TileWidth, TileHeight); } static public Rectangle GetExtendedSourceRectangle(int tileIndex, int height) { int tileY = tileIndex / (TileSetTexture.Width / TileWidth); int tileX = tileIndex % (TileSetTexture.Width / TileWidth); return new Rectangle(tileX * TileWidth, tileY * TileHeight, TileWidth, TileHeight*height); } static public void OutlineSquare(SpriteBatch batch, float x, float y, Color color) { Tile.OutlineSquare(batch, x, y, color, 1); } static public void OutlineSquare(SpriteBatch batch, float x, float y, Color color, int size) { Vector2 adjust2 = new Vector2(Tile.TileSpriteWidth / 2, Tile.TileSpriteHeight); //TODO figure out why this second value shouldn't be halved //Upper right //float x = this.mouseGrid.X; //float y = this.mouseGrid.Y; Line.drawLine(batch, new Vector2(((x - y) * Tile.TileSpriteWidth / 2), (x + y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x - y + size) * Tile.TileSpriteWidth / 2), (x + y + size) * Tile.TileSpriteHeight / 2) + adjust2, color, 0.77f); //Bottom right Line.drawLine(batch, new Vector2(((x + size - y) * Tile.TileSpriteWidth / 2), (x + size + y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x + size - (y + size)) * Tile.TileSpriteWidth / 2), (x + size + (y + size)) * Tile.TileSpriteHeight / 2) + adjust2, color, 0.77f); //Bottom left Line.drawLine(batch, new Vector2(((x - (y + size)) * Tile.TileSpriteWidth / 2), (x + y + size) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x + size - (y + size)) * Tile.TileSpriteWidth / 2), (x + size + (y + size)) * Tile.TileSpriteHeight / 2) + adjust2, color, 0.77f); //Upper left Line.drawLine(batch, new Vector2(((x - y) * Tile.TileSpriteWidth / 2), (x + y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x - (y + size)) * Tile.TileSpriteWidth / 2), (x + (y + size)) * Tile.TileSpriteHeight / 2) + adjust2, color, 0.77f); } static public void OutlineSquare2(SpriteBatch batch, float x, float y, Color color, int size) { Vector2 adjust2 = new Vector2(Tile.TileSpriteWidth / 2, Tile.TileSpriteHeight); //TODO figure out why this second value shouldn't be halved //Upper right //float x = this.mouseGrid.X; //float y = this.mouseGrid.Y; // int size_less_one = size - 1; Line.drawLine(batch, new Vector2(((x - y) * Tile.TileSpriteWidth / 2), (x + y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x - y + size_less_one) * Tile.TileSpriteWidth / 2), (x + y + size_less_one) * Tile.TileSpriteHeight / 2) + adjust2, color, Tile.DEPTH); //Bottom right Line.drawLine(batch, new Vector2(((x + size - y) * Tile.TileSpriteWidth / 2), (x + size_less_one + y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x + size - (y + size)) * Tile.TileSpriteWidth / 2), (x + size_less_one + (y + size_less_one)) * Tile.TileSpriteHeight / 2) + adjust2, color, Tile.DEPTH); //Bottom left Line.drawLine(batch, new Vector2(((x - (y + size)) * Tile.TileSpriteWidth / 2), (x + y + size) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x + size - (y + size)) * Tile.TileSpriteWidth / 2), (x + size + (y + size)) * Tile.TileSpriteHeight / 2) + adjust2, color, Tile.DEPTH); //Upper left Line.drawLine(batch, new Vector2(((x - y) * Tile.TileSpriteWidth / 2), (x + y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((x - (y + size)) * Tile.TileSpriteWidth / 2), (x + (y + size)) * Tile.TileSpriteHeight / 2) + adjust2, color, Tile.DEPTH); } public static void drawOutline(SpriteBatch batch, Color color) { Vector2[] squares = {new Vector2(15, 1), new Vector2(15,2)}; foreach (Vector2 square in squares) { } } public static void drawEdge(SpriteBatch batch, Edge edge, Color color) { //x = edge.Start.X //y = edge.Start.y //y + size = edge.End.y //x + size = edge.End.x Vector2 adjust2 = new Vector2(Tile.TileSpriteWidth / 2, Tile.TileSpriteHeight); //TODO figure out why this second value shouldn't be halved Line.drawLine(batch, new Vector2(((edge.Start.X - edge.Start.Y) * Tile.TileSpriteWidth / 2), (edge.Start.X + edge.Start.Y) * Tile.TileSpriteHeight / 2) + adjust2, //new Vector2(this.squaresAcross * Tile.TileSpriteWidth, (y+1) * Tile.TileSpriteHeight), new Vector2(((edge.End.X - edge.End.Y) * Tile.TileSpriteWidth / 2), (edge.End.X + edge.End.Y) * Tile.TileSpriteHeight / 2) + adjust2, color, 0.80f); //Just behind the default } public static void drawEdges(SpriteBatch batch, Edge[] edges, Color color) { foreach (Edge edge in edges) { drawEdge(batch, edge, color); } } public static void DrawOutlinedSquares(SpriteBatch batch, Vector2[] squares, Color color) { List edges = new List(); foreach (Vector2 square in squares) { //upper right edges.Add(new Edge {Start=square, End=square + new Vector2(1, 0)}); //lower right edges.Add(new Edge {Start=square + new Vector2(1, 0), End=square + new Vector2(1, 1)}); //lower left edges.Add(new Edge {Start=square + new Vector2(0, 1), End=square + new Vector2(1, 1)}); //upper left edges.Add(new Edge {Start=square, End=square + new Vector2(0, 1)}); } //Seems to be v. slow edges = edges.GroupBy(x => x).Where(grp => grp.Count() == 1).Select(grp => grp.Key).ToList(); drawEdges(batch, edges.ToArray(), color); } public static void drawTileAt(SpriteBatch batch, int x, int y, int tileIndex, int height, float depth) { drawTileAt(batch, x, y, tileIndex, height, depth, Color.White); } public static void drawTileAt(SpriteBatch batch, int x, int y, int tileIndex, int height, float depth, Color color) { //new Color(100, 100, 100, 100) int height_adjust = 0; if (height > 1) //not sure why this is necessary :/ { height_adjust = height; } int adjustedx = x - height_adjust; int adjustedy = y - height_adjust; int screenx = (adjustedx - adjustedy) * Tile.TileSpriteWidth / 2; int screeny = (adjustedx + adjustedy) * Tile.TileSpriteHeight / 2; // if (this.cull(x, y)) // { batch.Draw( Tile.TileSetTexture, new Rectangle( screenx, screeny, Tile.TileWidth, Tile.TileHeight * height), Tile.GetExtendedSourceRectangle(tileIndex, height), color, 0.0f, Vector2.Zero, SpriteEffects.None, depth); // } } } }