// Return an enumerable list of tiles contained within the given tile grid area. public IEnumerable <Tile> GetTilesInArea(Rectangle2I area, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Rectangle2I clippedArea = Rectangle2I.Intersect(area, new Rectangle2I(Point2I.Zero, gridDimensions)); foreach (int i in GetLayers(layerOrder)) { for (int y = clippedArea.Top; y < clippedArea.Bottom; y++) { for (int x = clippedArea.Left; x < clippedArea.Right; x++) { Tile tile = tiles[x, y, i]; if (tile != null) { Point2I loc = tile.TileGridArea.Point; if (!clippedArea.Contains(loc)) { loc = Point2I.Clamp(loc, clippedArea); } if (x == loc.X && y == loc.Y) { yield return(tile); } } } } } }
// Return an enumerable list of tiles touching the given point. public IEnumerable <Tile> GetTilesAtPosition(Vector2F position, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Point2I location = GetTileLocation(position); foreach (Tile tile in GetTilesAtLocation(location, layerOrder)) { if (tile.Bounds.Contains(position)) { yield return(tile); } } }
// Return an enumerable list of tiles touching the given rectangular bounds. public IEnumerable <Tile> GetTilesTouching(Rectangle2F bounds, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Rectangle2I area = GetTileAreaFromRect(bounds); foreach (Tile tile in GetTilesInArea(area, layerOrder)) { if (tile.Bounds.Intersects(bounds)) { yield return(tile); } } }
// Return an enumerable list of solid tiles colliding with the given collision box. public IEnumerable <Tile> GetSolidTilesColliding(Rectangle2F collisionBox, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Rectangle2I area = GetTileAreaFromRect(collisionBox); foreach (Tile tile in GetTilesInArea(area, layerOrder)) { if (tile.IsSolid && tile.CollisionModel != null && CollisionModel.Intersecting(tile.CollisionModel, tile.Position, collisionBox)) { yield return(tile); } } }
//----------------------------------------------------------------------------- // Tile Accessors //----------------------------------------------------------------------------- // Return an enumerable list of tiles at the given location. public IEnumerable <Tile> GetTilesAtLocation(Point2I location, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { if (IsTileInBounds(location)) { foreach (int i in GetLayers(layerOrder)) { Tile tile = tiles[location.X, location.Y, i]; if (tile != null) { yield return(tile); } } } }
// Return an enumerable list of tile layers in the specified order. public IEnumerable <int> GetLayers(TileLayerOrder order) { if (order == TileLayerOrder.LowestToHighest) { for (int layer = 0; layer < layerCount; layer++) { yield return(layer); } } else { for (int layer = layerCount - 1; layer >= 0; layer--) { yield return(layer); } } }
// Return an enumerable list of all tiles. public IEnumerable <Tile> GetTiles(TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { foreach (int i in GetLayers(layerOrder)) { for (int x = 0; x < GridWidth; x++) { for (int y = 0; y < GridHeight; y++) { Tile tile = tiles[x, y, i]; if (tile != null && IsTileAtGridLocation(tile, x, y)) { yield return(tile); } } } } }
// Return an enumerable list of tiles contained within the given tile grid area. public IEnumerable<Tile> GetTilesInArea(Rectangle2I area, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Rectangle2I clippedArea = Rectangle2I.Intersect(area, new Rectangle2I(Point2I.Zero, gridDimensions)); foreach (int i in GetLayers(layerOrder)) { for (int y = clippedArea.Top; y < clippedArea.Bottom; y++) { for (int x = clippedArea.Left; x < clippedArea.Right; x++) { Tile tile = tiles[x, y, i]; if (tile != null) { Point2I loc = tile.TileGridArea.Point; if (!clippedArea.Contains(loc)) loc = Point2I.Clamp(loc, clippedArea); if (x == loc.X && y == loc.Y) yield return tile; } } } } }
// Return an enumerable list of tiles touching the given rectangular bounds. public IEnumerable<Tile> GetTilesTouching(Rectangle2F bounds, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Rectangle2I area = GetTileAreaFromRect(bounds); foreach (Tile tile in GetTilesInArea(area, layerOrder)) { if (tile.Bounds.Intersects(bounds)) yield return tile; } }
// Return an enumerable list of tiles touching the given point. public IEnumerable<Tile> GetTilesAtPosition(Vector2F position, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Point2I location = GetTileLocation(position); foreach (Tile tile in GetTilesAtLocation(location, layerOrder)) { if (tile.Bounds.Contains(position)) yield return tile; } }
//----------------------------------------------------------------------------- // Tile Accessors //----------------------------------------------------------------------------- // Return an enumerable list of tiles at the given location. public IEnumerable<Tile> GetTilesAtLocation(Point2I location, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { if (IsTileInBounds(location)) { foreach (int i in GetLayers(layerOrder)) { Tile tile = tiles[location.X, location.Y, i]; if (tile != null) yield return tile; } } }
// Return an enumerable list of all tiles. public IEnumerable<Tile> GetTiles(TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { foreach (int i in GetLayers(layerOrder)) { for (int x = 0; x < GridWidth; x++) { for (int y = 0; y < GridHeight; y++) { Tile tile = tiles[x, y, i]; if (tile != null && IsTileAtGridLocation(tile, x, y)) yield return tile; } } } }
// Return an enumerable list of solid tiles colliding with the given collision box. public IEnumerable<Tile> GetSolidTilesColliding(Rectangle2F collisionBox, TileLayerOrder layerOrder = TileLayerOrder.LowestToHighest) { Rectangle2I area = GetTileAreaFromRect(collisionBox); foreach (Tile tile in GetTilesInArea(area, layerOrder)) { if (tile.IsSolid && tile.CollisionModel != null && CollisionModel.Intersecting(tile.CollisionModel, tile.Position, collisionBox)) yield return tile; } }
// Return an enumerable list of tile layers in the specified order. public IEnumerable<int> GetLayers(TileLayerOrder order) { if (order == TileLayerOrder.LowestToHighest) { for (int layer = 0; layer < layerCount; layer++) yield return layer; } else { for (int layer = layerCount - 1; layer >= 0; layer--) yield return layer; } }