Exemplo n.º 1
0
 public Tiled.Layer Map(LayerTilemap src, Tiled.Layer dst = null)
 {
     if (dst == null)
     {
         dst = new Tiled.Layer();
     }
     dst.Name    = src.Name;
     dst.Visible = src.Visible;
     dst.Properties[nameof(LayerTilemap.DefinitionId)] = src.DefinitionId;
     dst.Opacity = src.Opacity;
     dst.Properties[nameof(LayerTilemap.ProcessingMode)] = src.ProcessingMode;
     dst.Width  = src.Width;
     dst.Height = src.Height;
     dst.Data   = new uint[src.Width, src.Height];
     for (int y = 0; y < src.Height; y++)
     {
         for (int x = 0; x < src.Width; x++)
         {
             var data = src.Tiles[x, y];
             dst.Data[x, y] = (uint)(
                 (data.Index & Tiled.Layer.INDEX_FLAG) |
                 (data.IsFlippedX ? Tiled.Layer.FLIPPED_HORIZONTALLY_FLAG : 0) |
                 (data.IsFlippedY ? Tiled.Layer.FLIPPED_VERTICALLY_FLAG : 0)
                 );
         }
     }
     dst.Encoding    = "base64";
     dst.Compression = "gzip";
     return(dst);
 }
Exemplo n.º 2
0
 public LayerTilemap Map(Tiled.Layer src, LayerTilemap dst = null)
 {
     if (dst == null)
     {
         dst = new LayerTilemap();
     }
     dst.Name           = src.Name;
     dst.Visible        = src.Visible;
     dst.Opacity        = src.Opacity;
     dst.DefinitionId   = GetPropertyValue(src.Properties, default(Guid), nameof(LayerTilemap.DefinitionId));
     dst.ProcessingMode = GetPropertyValue(src.Properties, LayerProcessingMode.Tilemap,
                                           nameof(LayerTilemap.ProcessingMode));
     dst.Tiles = new Tile[src.Data.GetLength(0), src.Data.GetLength(1)];
     for (int y = 0; y < src.Height; y++)
     {
         for (int x = 0; x < src.Width; x++)
         {
             var data = src.Data[x, y];
             dst.Tiles[x, y] = new Tile()
             {
                 Tileset    = 0,
                 Index      = (int)(data & Tiled.Layer.INDEX_FLAG),
                 IsFlippedX = (data & Tiled.Layer.FLIPPED_HORIZONTALLY_FLAG) != 0,
                 IsFlippedY = (data & Tiled.Layer.FLIPPED_VERTICALLY_FLAG) != 0
             };
         }
     }
     return(dst);
 }
Exemplo n.º 3
0
        //Load tilemap data from a stream (in a tiled JSON format)
        //return false on failure, or just throws an exception
        public bool load(StreamReader stream)
        {
            landMarks.Clear();
            JsonSerializer js = new JsonSerializer();

            Tiled.TileMap map = js.Deserialize <Tiled.TileMap>(new JsonTextReader(stream));
            if (map.height == 0 || map.width == 0)
            {
                return(false);
            }
            tileDefinitions = new Dictionary <long, TileDefinition>();

            foreach (var k in map.tilesets)
            {
                foreach (var pair in k.tiles)
                {
                    var            gid     = pair.Key + k.firstgid;
                    TileDefinition tiledef = new TileDefinition();
                    tiledef.image = pair.Value.image;
                    tileDefinitions.Add(gid, tiledef);
                }
            }
            Tiled.Layer tilelayer = null;
            Tiled.Layer colllayer = null;
            foreach (var lay in map.layers)
            {
                if (lay.type == "tilelayer")
                {
                    if (lay.name == "terrain")
                    {
                        tilelayer = lay;
                    }
                    if (lay.name == "collision")
                    {
                        colllayer = lay;
                    }
                }
                if (lay.type == "objectgroup" && lay.objects != null)
                {
                    if (lay.name == "landmarks")
                    {
                        foreach (var obj in lay.objects)
                        {
                            LandMark l = new LandMark();
                            //Tiled object position refers to the lower left point of the object
                            //(lowest x value, highest y value)
                            if (obj.properties != null)
                            {
                                l.properties = new Dictionary <string, string>(obj.properties);
                            }
                            else
                            {
                                l.properties = new Dictionary <string, string>();
                            }
                            l.image = "";
                            TileDefinition td;
                            tileDefinitions.TryGetValue(obj.gid & gidmask, out td);
                            if (obj.gid > 0)
                            {
                                l.image = td.image;
                                l.area  = new Rectangle(new Vec2(obj.x + obj.width / 2, obj.y - obj.height / 2), obj.width, obj.height);
                            }
                            else
                            {
                                l.area = new Rectangle(new Vec2(obj.x + obj.width / 2, obj.y + obj.height / 2), obj.width, obj.height);
                            }

                            landMarks.Add(l);
                        }
                    }
                }
            }
            if (tilelayer == null)
            {
                return(false);
            }

            if (tilelayer.data.Count != map.width * map.height)
            {
                return(false);
            }


            if (colllayer == null || colllayer.data.Count != map.width * map.height)
            {
                colllayer = null;
            }

            _height = map.height;
            _width  = map.width;
            tiles   = new List <Tile>();

            int i = 0;

            foreach (var k in tilelayer.data)
            {
                bool collision = false;
                if (colllayer != null)
                {
                    collision = colllayer.data[i] > 0;
                }

                TileDefinition td = null;
                tileDefinitions.TryGetValue(k, out td);

                Tile t = new Tile(td, collision);
                tiles.Add(t);
                i++;
            }

            return(true);
        }