Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }