/// <summary> /// Create a grid based on this tilemap. /// </summary> /// <param name="solidTiles">The tile indeces to be treated as solid.</param> /// <returns></returns> public HitGrid CreateGrid(params int[] solidTiles) { var tiles = solidTiles.ToList(); var grid = new HitGrid(Width, Height, TileWidth, TileHeight); for (int row = 0; row < Rows; row++) { for (int col = 0; col < Columns; col++) { grid[col, row] = tiles.Contains(data[col, row]); } } return(grid); }
private Entity OperateOnGridLayer(XmlElement level, XmlNode layer) { if (!_gridTypes.TryGetValue(layer.Name, out var def)) { return(null); } var width = int.Parse(level.Attributes["width"].Value); var height = int.Parse(level.Attributes["height"].Value); var tileWidth = def.CellWidth; var tileHeight = def.CellHeight; width -= width % tileWidth; height -= height % tileHeight; var grid = new HitGrid(width, height, tileWidth, tileHeight) { Type = def.CollisionType }; var mode = layer.Attributes["exportMode"].Value; if (mode.Contains("Bitstring")) { grid.LoadFromString(layer.InnerText, "", "\n"); } else if (mode.Contains("Rectangles")) { foreach (XmlNode rect in layer) { var x = int.Parse(rect.Attributes["x"].Value); var y = int.Parse(rect.Attributes["y"].Value); var w = int.Parse(rect.Attributes["w"].Value); var h = int.Parse(rect.Attributes["h"].Value); if (mode == "Rectangles") { x %= grid.CellWidth; y %= grid.CellHeight; w %= grid.CellWidth; h %= grid.CellHeight; } grid.SetRect(x, y, w, h, true); } } Entity e; if (def.EntityType == null) { e = new Entity(); } else { e = CreateInstance(def.EntityType, layer); } e.Components.Add(grid); e.Name = layer.Name; e.Components.AddAndRemove(true); if (e is IOgmoNodeHandler handler) { handler.NodeHandler(layer); } return(e); }