예제 #1
0
    public OgmoLevel(string xmlString)
    {
        var xml = new XmlDocument();

        xml.LoadXml(xmlString);

        var root = xml.DocumentElement;

        width  = int.Parse(root.GetAttribute("width")) / 16;
        height = int.Parse(root.GetAttribute("height")) / 16;

        var tilesString = root["Tiles"].InnerText;

        tilesString = Regex.Replace(tilesString, @"\r\n?|\n|,", "");
        tiles       = new int[tilesString.Length];

        for (int i = 0; i < tilesString.Length; i++)
        {
            // flip map vertically
            var x     = i % width;
            var y     = height - (i / width) - 1;
            var index = y * width + x;
            tiles[index] = int.Parse(tilesString[i].ToString());
        }

        var ents = root["Entities"].ChildNodes;

        entities = new OgmoEntity[ents.Count];
        var usedIds = new bool[ents.Count];

        for (int i = 0; i < ents.Count; i++)
        {
            var ent = ents[i];
            var id  = int.Parse(ent.Attributes["id"].Value);
            if (id < ents.Count)
            {
                usedIds[id] = true;
            }
        }

        for (int i = 0; i < ents.Count; i++)
        {
            var ent = ents[i];
            var id  = int.Parse(ent.Attributes["id"].Value);
            var x   = int.Parse(ent.Attributes["x"].Value) / 16f;
            // flip vertically
            var y = height - int.Parse(ent.Attributes["y"].Value) / 16f;

            if (id >= ents.Count)
            {
                for (int j = 0; j < ents.Count; j++)
                {
                    if (!usedIds[j])
                    {
                        id         = j;
                        usedIds[j] = true;
                        break;
                    }
                }
            }

            entities[id] = new OgmoEntity(id, ent.Name, new Vector2(x, y));

            foreach (XmlAttribute attr in ent.Attributes)
            {
                if (attr.Name != "id" && attr.Name != "y" && attr.Name != "y")
                {
                    entities[id].data.Add(attr.Name, attr.Value);
                }
            }
        }
    }
예제 #2
0
        public override OgmoLayer ReadJson(JsonReader reader, Type objectType, OgmoLayer existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            JObject     obj     = JObject.Load(reader);
            OgmoProject project = serializer.Context.Context as OgmoProject;

            OgmoLayerDefinition[] context = project.LayerDefinitions;
            if (context == null)
            {
                throw new Exception("You must pass the OgmoProject as a serializer context to deserialize this type.");
            }

            var eid = (string)obj["_eid"];

            for (int i = 0; i < context.Length; i++)
            {
                if (context[i] == null) // Grid layers arent implemented, nor will they.
                {
                    continue;
                }
                if (eid == context[i].ExportID)
                {
                    // Found the matching definition.
                    var def = context[i];

                    switch (def)
                    {
                    case OgmoTileLayerDefinition tile:
                        OgmoTileLayer tileLayer = new OgmoTileLayer();
                        tileLayer.Target   = tile;
                        tileLayer.TileSet  = (string)obj["tileset"];
                        tileLayer.ExportID = eid;

                        // Todo: read the data array mode and map it to a 1d array always.
                        var dat = obj["data"].Children().ToArray();
                        tileLayer.Data = new int[dat.Length];
                        for (int j = 0; j < dat.Length; j++)
                        {
                            tileLayer.Data[j] = (int)dat[j];
                        }

                        tileLayer.CellSize  = new Point((int)obj["gridCellWidth"], (int)obj["gridCellHeight"]);
                        tileLayer.CellCount = new Point((int)obj["gridCellsX"], (int)obj["gridCellsY"]);
                        return(tileLayer);

                    case OgmoEntityLayerDefinition entity:
                        OgmoEntityLayer entityLayer = new OgmoEntityLayer();
                        entityLayer.ExportID = eid;
                        entityLayer.Target   = entity;
                        var valuelist = obj["entities"].Children().ToArray();
                        entityLayer.Entities = new OgmoEntity[valuelist.Length];
                        for (int x = 0; x < valuelist.Length; x++)
                        {
                            OgmoEntity ov     = new OgmoEntity();
                            OgmoEntity result = (OgmoEntity)OgmoEntityConverter.Instance.ReadJson(valuelist[x].CreateReader(), typeof(OgmoEntity), ov, serializer);
                            entityLayer.Entities[x] = result;
                        }
                        return(entityLayer);
                    }
                }
            }
            return(null);
        }
예제 #3
0
 private void LoadEntity(OgmoEntity entity)
 {
     var go = GetPrefab (entity.name);
     if (go != null) {
         go = (GameObject)GameObject.Instantiate (go);
         go.transform.parent = lvl.transform;
         OTObject ot = go.GetComponent<OTObject> ();
         Vector3 pos = new Vector3 (((float)entity.x) / 16f, 0.25f, 15f - ((float)entity.y) / 16f);
         var size = GetEntitySize (entity.name) * 0.5f;
         pos.x += size.x * 0.5f;
         pos.z -= size.y * 0.5f;
         go.transform.localPosition = pos;
         if (ot != null) {
             ot.position = new Vector2 (go.transform.localPosition.x, go.transform.localPosition.z);
             ot.depth = -1;
         }
     }
 }