Files
MonoGame.Extended/Source/MonoGame.Extended.Tiled/TiledMapReader.cs
T
Lucas Girouard-StranksandDylan Wilson 9e359fb750 Tiled Rework (#331)
* Tiled Rework

* fix failing tests

* really fix failing tests
2017-01-18 20:46:38 +10:00

102 lines
3.2 KiB
C#

#region
using System;
using Microsoft.Xna.Framework.Content;
using MonoGame.Extended.Tiled.Graphics;
#endregion
namespace MonoGame.Extended.Tiled
{
public class TiledMapReader : ContentTypeReader<TiledMap>
{
protected override TiledMap Read(ContentReader input, TiledMap existingInstance)
{
if (existingInstance != null)
return existingInstance;
;
var value = ReadMetaData(input);
ReadTilesets(input, value);
ReadLayers(input, value);
return value;
}
private static TiledMap ReadMetaData(ContentReader input)
{
var name = input.AssetName;
var width = input.ReadInt32();
var height = input.ReadInt32();
var tileWidth = input.ReadInt32();
var tileHeight = input.ReadInt32();
var backgroundColor = input.ReadColor();
var renderOrder = (TiledMapTileDrawOrder)input.ReadByte();
var orientation = (TiledMapOrientation)input.ReadByte();
var map = new TiledMap(name, width, height, tileWidth, tileHeight, renderOrder, orientation)
{
BackgroundColor = backgroundColor
};
input.ReadTiledMapProperties(map.Properties);
return map;
}
private static void ReadTilesets(ContentReader input, TiledMap map)
{
var tilesetCount = input.ReadInt32();
for (var i = 0; i < tilesetCount; i++)
{
var tileset = new TiledMapTileset(input);
map.AddTileset(tileset);
}
}
private static void ReadLayers(ContentReader input, TiledMap map)
{
var layerCount = input.ReadInt32();
for (var i = 0; i < layerCount; i++)
{
TiledMapLayer layer;
var layerType = (TiledMapLayerType)input.ReadByte();
switch (layerType)
{
case TiledMapLayerType.ImageLayer:
layer = new TiledMapImageLayer(input);
break;
case TiledMapLayerType.TileLayer:
layer = new TiledMapTileLayer(input, map);
break;
case TiledMapLayerType.ObjectLayer:
layer = new TiledMapObjectLayer(input, map);
break;
default:
throw new ArgumentOutOfRangeException();
}
if (layerType != TiledMapLayerType.ObjectLayer)
ReadModels(input, layer, map);
map.AddLayer(layer);
}
}
private static void ReadModels(ContentReader input, TiledMapLayer layer, TiledMap map)
{
var modelsCount = input.ReadInt32();
for (var i = 0; i < modelsCount; i++)
{
var isAnimated = input.ReadBoolean();
var model = isAnimated ? new TiledMapLayerAnimatedModel(input, map) : new TiledMapLayerModel(input);
layer.AddModel(model);
}
}
}
}