public static ReducedTileMapInfo FromTiledMapSave(TiledMapSave tiledMapSave, float scale, string directory) { var toReturn = new ReducedTileMapInfo(); var ses = tiledMapSave.ToSceneSave(1); ses.SpriteList.Sort((first, second) => first.Z.CompareTo(second.Z)); float z = float.NaN; ReducedLayerInfo reducedLayerInfo = null; Dictionary<string, Point> loadedTextures = new Dictionary<string, Point>(); if (ses.SpriteList.Count != 0) { SpriteSave spriteSave = ses.SpriteList[0]; Point point = GetTextureDimensions(directory, loadedTextures, spriteSave); toReturn.CellHeightInPixels = (ushort)FlatRedBall.Math.MathFunctions.RoundToInt((spriteSave.BottomTextureCoordinate - spriteSave.TopTextureCoordinate) * point.Y); toReturn.CellWidthInPixels = (ushort)FlatRedBall.Math.MathFunctions.RoundToInt((spriteSave.RightTextureCoordinate - spriteSave.LeftTextureCoordinate) * point.X); toReturn.QuadWidth = spriteSave.ScaleX * 2; toReturn.QuadHeight = spriteSave.ScaleY * 2; } foreach (SpriteSave spriteSave in ses.SpriteList) { if (spriteSave.Z != z) { z = spriteSave.Z; reducedLayerInfo = new ReducedLayerInfo(); reducedLayerInfo.Texture = spriteSave.Texture; toReturn.Layers.Add(reducedLayerInfo); } Point point = GetTextureDimensions(directory, loadedTextures, spriteSave); ReducedQuadInfo quad = ReducedQuadInfo.FromSpriteSave(spriteSave, point.X, point.Y); reducedLayerInfo.Quads.Add(quad); } return toReturn; }
public static ReducedTileMapInfo ReadFrom(BinaryReader reader) { ReducedTileMapInfo toReturn = new ReducedTileMapInfo(); toReturn.CellWidthInPixels = reader.ReadUInt16(); toReturn.CellHeightInPixels = reader.ReadUInt16(); toReturn.QuadHeight = reader.ReadSingle(); toReturn.QuadWidth = reader.ReadSingle(); toReturn.NumberOfLayers = reader.ReadUInt32(); for (int i = 0; i < toReturn.NumberOfLayers; i++) { toReturn.Layers.Add(ReducedLayerInfo.ReadFrom(reader)); } return toReturn; }
private void Verify(ReducedTileMapInfo rtmi, string fileName) { using(FileStream stream = File.OpenRead(fileName)) using(BinaryReader reader = new BinaryReader(stream)) { ReducedTileMapInfo compareAgainst = ReducedTileMapInfo.ReadFrom(reader); string original; string fromFile; FileManager.XmlSerialize(rtmi, out original); FileManager.XmlSerialize(compareAgainst, out fromFile); if (original != fromFile) { throw new Exception("NONONO"); } } }
/// <summary> /// Converts a TiledMapSave to a ReducedTileMapInfo object /// </summary> /// <param name="tiledMapSave">The TiledMapSave to convert</param> /// <param name="scale">The amount to scale by - default of 1</param> /// <param name="zOffset">The zOffset</param> /// <param name="directory">The directory of the file associated with the tiledMapSave, used to find file references.</param> /// <param name="referenceType">How the files in the .tmx are referenced.</param> /// <returns></returns> public static ReducedTileMapInfo FromTiledMapSave(TiledMapSave tiledMapSave, float scale, float zOffset, string directory, FileReferenceType referenceType) { var toReturn = new ReducedTileMapInfo { NumberCellsTall = tiledMapSave.Height, NumberCellsWide = tiledMapSave.Width }; var ses = tiledMapSave.ToSceneSave(scale, referenceType); // This is not a stable sort! //ses.SpriteList.Sort((first, second) => first.Z.CompareTo(second.Z)); ses.SpriteList = ses.SpriteList.OrderBy(item => item.Z).ToList(); ReducedLayerInfo reducedLayerInfo = null; // If we rely on the image, it's both slow (have to open the images), and // doesn't work at runtime in games: //Dictionary<string, Point> loadedTextures = new Dictionary<string, Point>(); //SetCellWidthAndHeight(tiledMapSave, directory, toReturn, ses, loadedTextures); toReturn.CellHeightInPixels = (ushort)tiledMapSave.tileheight; toReturn.CellWidthInPixels = (ushort)tiledMapSave.tilewidth; SetQuadWidthAndHeight(toReturn, ses); float z = float.NaN; int textureWidth = 0; int textureHeight = 0; AbstractMapLayer currentLayer = null; int indexInLayer = 0; foreach (var spriteSave in ses.SpriteList) { if (spriteSave.Z != z) { indexInLayer = 0; z = spriteSave.Z; int layerIndex = FlatRedBall.Math.MathFunctions.RoundToInt(z - zOffset); var abstractMapLayer = tiledMapSave.MapLayers[layerIndex]; currentLayer = abstractMapLayer; reducedLayerInfo = new ReducedLayerInfo { Z = spriteSave.Z, Texture = spriteSave.Texture, Name = abstractMapLayer.Name, TileWidth = FlatRedBall.Math.MathFunctions.RoundToInt(spriteSave.ScaleX * 2), TileHeight = FlatRedBall.Math.MathFunctions.RoundToInt(spriteSave.ScaleY * 2) }; var mapLayer = abstractMapLayer as MapLayer; // This should have data: if (mapLayer != null) { var idOfTexture = mapLayer.data[0].tiles.FirstOrDefault(item => item != 0); Tileset tileSet = tiledMapSave.GetTilesetForGid(idOfTexture); var tilesetIndex = tiledMapSave.Tilesets.IndexOf(tileSet); textureWidth = tileSet.Images[0].width; textureHeight = tileSet.Images[0].height; reducedLayerInfo.TextureId = tilesetIndex; toReturn.Layers.Add(reducedLayerInfo); } var objectGroup = tiledMapSave.MapLayers[layerIndex] as mapObjectgroup; // This code only works based on the assumption that only one tileset will be used in any given object layer's image objects var mapObjectgroupObject = [email protected](o => o.gid != null); if (mapObjectgroupObject?.gid != null) { var idOfTexture = mapObjectgroupObject.gid.Value; Tileset tileSet = tiledMapSave.GetTilesetForGid(idOfTexture); var tilesetIndex = tiledMapSave.Tilesets.IndexOf(tileSet); textureWidth = tileSet.Images[0].width; textureHeight = tileSet.Images[0].height; reducedLayerInfo.TextureId = tilesetIndex; toReturn.Layers.Add(reducedLayerInfo); } } ReducedQuadInfo quad = ReducedQuadInfo.FromSpriteSave(spriteSave, textureWidth, textureHeight); if (currentLayer is mapObjectgroup) { var objectInstance = (currentLayer as mapObjectgroup)[email protected][indexInLayer]; if (objectInstance.properties.Count != 0) { var nameProperty = objectInstance.properties.FirstOrDefault(item => item.StrippedNameLower == "name"); if (nameProperty != null) { quad.Name = nameProperty.value; } else { quad.Name = spriteSave.Name; bool needsName = string.IsNullOrEmpty(spriteSave.Name); if (needsName) { quad.Name = $"_{currentLayer.Name}runtime{indexInLayer}"; } } List<NamedValue> list = new List<NamedValue>(); foreach (var property in objectInstance.properties) { list.Add( new NamedValue { Name = property.StrippedName, Value = property.value, Type = property.Type } ); } quad.QuadSpecificProperties = list; } } reducedLayerInfo?.Quads.Add(quad); indexInLayer++; } return toReturn; }
private static void SetQuadWidthAndHeight(ReducedTileMapInfo toReturn, SceneSave ses) { if (ses.SpriteList.Count != 0) { SpriteSave spriteSave = ses.SpriteList[0]; toReturn.QuadWidth = spriteSave.ScaleX * 2; toReturn.QuadHeight = spriteSave.ScaleY * 2; } }