mirror of
https://github.com/AlexMacocian/MonoGame.Extended.git
synced 2026-07-24 20:12:23 +00:00
106 lines
3.6 KiB
C#
106 lines
3.6 KiB
C#
using System;
|
|
using Microsoft.Xna.Framework.Content;
|
|
using MonoGame.Extended.Tiled.Graphics;
|
|
|
|
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 modelCount = input.ReadInt32();
|
|
var animatedModelCount = input.ReadInt32();
|
|
|
|
var models = layer.Models = new TiledMapLayerModel[modelCount];
|
|
var animatedModels = layer.AnimatedModels = new TiledMapLayerAnimatedModel[animatedModelCount];
|
|
|
|
var animatedModelIndex = 0;
|
|
|
|
for (var modelIndex = 0; modelIndex < modelCount; modelIndex++)
|
|
{
|
|
var isAnimated = input.ReadBoolean();
|
|
var model = isAnimated ? new TiledMapLayerAnimatedModel(input, map) : new TiledMapLayerModel(input);
|
|
|
|
models[modelIndex] = model;
|
|
if (isAnimated)
|
|
animatedModels[animatedModelIndex++] = (TiledMapLayerAnimatedModel)model;
|
|
}
|
|
}
|
|
}
|
|
} |