예제 #1
0
        public override TileMap Process(TileMapData input, ContentProcessorContext context)
        {
            TileMap tileMap = new TileMap(input.TileWidth, input.TileWidth, input.Width, input.Height);

            foreach (var tsRef in input.TileSets)
            {
                string tsPath = $"{TILE_SET_PATH}/{Path.GetFileNameWithoutExtension(tsRef.Source)}";
                tileMap.AddTileSetReference(tsRef.FirstGid, tsPath);
            }

            foreach (var layer in input.Layers)
            {
                TileMatrix tileMatrix = TileMatrix.ParseCsv(layer.Data);
                tileMap.AddLayer(new TileMapTileLayer(tileMap, layer.Id, layer.Name, tileMatrix));
            }

            foreach (var objGroup in input.ObjectGroups)
            {
                TileMapObjectLayer objLayer = new TileMapObjectLayer(tileMap, objGroup.Id, objGroup.Name);
                tileMap.AddLayer(objLayer);

                foreach (var objData in objGroup.Objects)
                {
                    if (objData.Point != null)
                    {
                        var pointObj = new TileMapPointObject(objData.Name, objData.Type, objData.Id, (float)objData.X, (float)objData.Y);
                        ProcessObjectProperties(objData, pointObj);

                        objLayer.AddObject(pointObj);
                    }
                    else if (objData.Polygon != null)
                    {
                        IEnumerable <Vector2> vertices = objData.Polygon.GetVertices();
                        var polygonObj = new TileMapPolygonObject(vertices, objData.Name, objData.Type, objData.Id, (float)objData.X, (float)objData.Y);

                        objLayer.AddObject(polygonObj);
                    }
                    else
                    {
                        TileMapRectangleObject tileMapRectangleObject = new TileMapRectangleObject(objData.Width, objData.Height, objData.Name, objData.Type, objData.Id, (float)objData.X, (float)objData.Y);

                        objLayer.AddObject(tileMapRectangleObject);
                    }
                }
            }

            return(tileMap);
        }
예제 #2
0
        private void WriteObjectLayer(ContentWriter output, TileMapObjectLayer layer)
        {
            output.Write(layer.Id);
            output.Write(layer.Name ?? string.Empty);

            output.Write(layer.Objects.Count(o => o.ObjectType == TileMapObjectType.Point));

            foreach (var pointObject in layer.Objects.OfType <TileMapPointObject>())
            {
                WriteSharedObjectData(output, pointObject);
            }

            output.Write(layer.Objects.Count(o => o.ObjectType == TileMapObjectType.Polygon));

            foreach (var polygonObj in layer.Objects.OfType <TileMapPolygonObject>())
            {
                WriteSharedObjectData(output, polygonObj);

                output.Write(polygonObj.VertexCount);

                foreach (var vert in polygonObj.Vertices)
                {
                    output.Write(vert);
                }
            }

            output.Write(layer.Objects.Count(o => o.ObjectType == TileMapObjectType.Rectangle));

            foreach (var rectObj in layer.Objects.OfType <TileMapRectangleObject>())
            {
                WriteSharedObjectData(output, rectObj);

                output.Write(rectObj.Width);
                output.Write(rectObj.Height);
            }
        }
예제 #3
0
        private IEnumerable <TileMapObjectLayer> ReadObjectLayers(ContentReader input, TileMap tileMap)
        {
            List <TileMapObjectLayer> layers = new List <TileMapObjectLayer>();

            int objLayerCount = input.ReadInt32();

            for (int i = 0; i < objLayerCount; i++)
            {
                int    layerId   = input.ReadInt32();
                string layerName = input.ReadString();

                TileMapObjectLayer tileMapObjectLayer = new TileMapObjectLayer(tileMap, layerId, layerName);

                int pointObjectCount = input.ReadInt32();

                for (int j = 0; j < pointObjectCount; j++)
                {
                    var sharedData = ReadSharedObjectData(input);

                    TileMapPointObject pointObj = new TileMapPointObject(sharedData.Name, sharedData.Type, sharedData.Id, sharedData.X, sharedData.Y);

                    ReadProperyMap(input, pointObj.CustomProperties);

                    tileMapObjectLayer.AddObject(pointObj);
                }

                int polygonObjectCount = input.ReadInt32();

                for (int j = 0; j < polygonObjectCount; j++)
                {
                    var sharedData = ReadSharedObjectData(input);

                    PropertyMap propMap = new PropertyMap();

                    ReadProperyMap(input, propMap);

                    List <Vector2> vertices = new List <Vector2>();

                    int vertexCount = input.ReadInt32();

                    for (int v = 0; v < vertexCount; v++)
                    {
                        Vector2 vertex = input.ReadVector2();
                        vertices.Add(vertex);
                    }

                    TileMapPolygonObject tileMapPolygon = new TileMapPolygonObject(vertices, sharedData.Name, sharedData.Type, sharedData.Id, sharedData.X, sharedData.Y);

                    foreach (var kvp in propMap)
                    {
                        tileMapPolygon.CustomProperties.Add(kvp);
                    }

                    tileMapObjectLayer.AddObject(tileMapPolygon);
                }

                int rectObjectCount = input.ReadInt32();

                for (int j = 0; j < rectObjectCount; j++)
                {
                    var sharedData = ReadSharedObjectData(input);

                    PropertyMap propMap = new PropertyMap();

                    ReadProperyMap(input, propMap);

                    float width  = input.ReadSingle();
                    float height = input.ReadSingle();

                    TileMapRectangleObject rectangleObject = new TileMapRectangleObject(width, height, sharedData.Name, sharedData.Type, sharedData.Id, sharedData.X, sharedData.Y);

                    tileMapObjectLayer.AddObject(rectangleObject);
                }

                layers.Add(tileMapObjectLayer);
            }

            return(layers);
        }