Beispiel #1
0
 public Tile(TileDefinition tileDef, bool collision)
 {
     this.tileDef    = tileDef;
     this.isBlocking = collision;
 }
Beispiel #2
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);
        }