diff --git a/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapWriter.cs b/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapWriter.cs index 2c8eab1a..8ba1b78e 100644 --- a/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapWriter.cs +++ b/src/cs/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapWriter.cs @@ -87,6 +87,8 @@ namespace MonoGame.Extended.Content.Pipeline.Tiled writer.Write(layer.Opacity); writer.Write(layer.OffsetX); writer.Write(layer.OffsetY); + writer.Write(layer.ParallaxX); + writer.Write(layer.ParallaxY); writer.WriteTiledMapProperties(layer.Properties); @@ -215,9 +217,9 @@ namespace MonoGame.Extended.Content.Pipeline.Tiled return TiledMapObjectType.Rectangle; } - + public override string GetRuntimeType(TargetPlatform targetPlatform) => "MonoGame.Extended.Tiled.TiledMap, MonoGame.Extended.Tiled"; public override string GetRuntimeReader(TargetPlatform targetPlatform) => "MonoGame.Extended.Tiled.TiledMapReader, MonoGame.Extended.Tiled"; } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/Renderers/TiledMapRenderer.cs b/src/cs/MonoGame.Extended.Tiled/Renderers/TiledMapRenderer.cs index 0f34e241..5254dae1 100644 --- a/src/cs/MonoGame.Extended.Tiled/Renderers/TiledMapRenderer.cs +++ b/src/cs/MonoGame.Extended.Tiled/Renderers/TiledMapRenderer.cs @@ -131,17 +131,18 @@ namespace MonoGame.Extended.Tiled.Renderers if (layer is TiledMapObjectLayer) return; - Draw(layer, Vector2.Zero, ref viewMatrix, ref projectionMatrix, effect, depth); + Draw(layer, Vector2.Zero, Vector2.One, ref viewMatrix, ref projectionMatrix, effect, depth); } - private void Draw(TiledMapLayer layer, Vector2 parentOffset, ref Matrix viewMatrix, ref Matrix projectionMatrix, Effect effect, float depth) - { + private void Draw(TiledMapLayer layer, Vector2 parentOffset, Vector2 parentParallaxFactor, ref Matrix viewMatrix, ref Matrix projectionMatrix, Effect effect, float depth) + { var offset = parentOffset + layer.Offset; + var parallaxFactor = parentParallaxFactor * layer.ParallaxFactor; if (layer is TiledMapGroupLayer groupLayer) { foreach (var subLayer in groupLayer.Layers) - Draw(subLayer, offset, ref viewMatrix, ref projectionMatrix, effect, depth); + Draw(subLayer, offset, parallaxFactor, ref viewMatrix, ref projectionMatrix, effect, depth); } else { @@ -152,9 +153,9 @@ namespace MonoGame.Extended.Tiled.Renderers if (tiledMapEffect == null) return; - // model-to-world transform - tiledMapEffect.World = _worldMatrix; - tiledMapEffect.View = viewMatrix; + // model-to-world transform + tiledMapEffect.World = _worldMatrix; + tiledMapEffect.View = parallaxFactor == Vector2.One ? viewMatrix : IncludeParallax(viewMatrix, parallaxFactor); tiledMapEffect.Projection = projectionMatrix; foreach (var layerModel in _mapModel.LayersOfLayerModels[layer]) @@ -181,5 +182,11 @@ namespace MonoGame.Extended.Tiled.Renderers } } } + + private Matrix IncludeParallax(Matrix viewMatrix, Vector2 parallaxFactor) + { + viewMatrix.Translation *=new Vector3(parallaxFactor, 1f); + return viewMatrix; + } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapLayerContent.cs b/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapLayerContent.cs index e657f531..f59f102c 100644 --- a/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapLayerContent.cs +++ b/src/cs/MonoGame.Extended.Tiled/Serialization/TiledMapLayerContent.cs @@ -12,6 +12,8 @@ namespace MonoGame.Extended.Tiled.Serialization { Type = type; Opacity = 1.0f; + ParallaxX = 1.0f; + ParallaxY = 1.0f; Visible = true; Properties = new List(); } @@ -31,16 +33,22 @@ namespace MonoGame.Extended.Tiled.Serialization [XmlAttribute(AttributeName = "offsety")] public float OffsetY { get; set; } + [XmlAttribute(AttributeName = "parallaxx")] + public float ParallaxX { get; set; } + + [XmlAttribute(AttributeName = "parallaxy")] + public float ParallaxY { get; set; } + [XmlArray("properties")] [XmlArrayItem("property")] public List Properties { get; set; } [XmlIgnore] public TiledMapLayerType Type { get; } - + public override string ToString() { return Name; } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapGroupLayer.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapGroupLayer.cs index 9e15e887..01d054b2 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapGroupLayer.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapGroupLayer.cs @@ -8,8 +8,8 @@ namespace MonoGame.Extended.Tiled public class TiledMapGroupLayer : TiledMapLayer { public List Layers { get; } - public TiledMapGroupLayer(string name, List layers, Vector2? offset = null, float opacity = 1, bool isVisible = true) - : base(name, offset, opacity, isVisible) + public TiledMapGroupLayer(string name, List layers, Vector2? offset = null, Vector2? parallaxFactor = null, float opacity = 1, bool isVisible = true) + : base(name, offset, parallaxFactor, opacity, isVisible) { Layers = layers; } diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapImageLayer.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapImageLayer.cs index 6d7575ee..1702434c 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapImageLayer.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapImageLayer.cs @@ -5,8 +5,8 @@ namespace MonoGame.Extended.Tiled { public class TiledMapImageLayer : TiledMapLayer, IMovable { - public TiledMapImageLayer(string name, Texture2D image, Vector2? position = null, Vector2? offset = null, float opacity = 1.0f, bool isVisible = true) - : base(name, offset, opacity, isVisible) + public TiledMapImageLayer(string name, Texture2D image, Vector2? position = null, Vector2? offset = null, Vector2? parallaxFactor = null, float opacity = 1.0f, bool isVisible = true) + : base(name, offset, parallaxFactor, opacity, isVisible) { Image = image; Position = position ?? Vector2.Zero; @@ -15,4 +15,4 @@ namespace MonoGame.Extended.Tiled public Texture2D Image { get; } public Vector2 Position { get; set; } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapLayer.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapLayer.cs index 356e9b01..f6a561c1 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapLayer.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapLayer.cs @@ -8,15 +8,17 @@ namespace MonoGame.Extended.Tiled public bool IsVisible { get; set; } public float Opacity { get; set; } public Vector2 Offset { get; set; } + public Vector2 ParallaxFactor { get; set; } public TiledMapProperties Properties { get; } - protected TiledMapLayer(string name, Vector2? offset = null, float opacity = 1.0f, bool isVisible = true) + protected TiledMapLayer(string name, Vector2? offset = null, Vector2? parallaxFactor = null, float opacity = 1.0f, bool isVisible = true) { Name = name; Offset = offset ?? Vector2.Zero; + ParallaxFactor = parallaxFactor ?? Vector2.One; Opacity = opacity; IsVisible = isVisible; Properties = new TiledMapProperties(); } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapObjectLayer.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapObjectLayer.cs index 0397203d..e5d492c8 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapObjectLayer.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapObjectLayer.cs @@ -4,9 +4,9 @@ namespace MonoGame.Extended.Tiled { public class TiledMapObjectLayer : TiledMapLayer { - public TiledMapObjectLayer(string name, TiledMapObject[] objects, Color? color = null, TiledMapObjectDrawOrder drawOrder = TiledMapObjectDrawOrder.TopDown, - Vector2? offset = null, float opacity = 1.0f, bool isVisible = true) - : base(name, offset, opacity, isVisible) + public TiledMapObjectLayer(string name, TiledMapObject[] objects, Color? color = null, TiledMapObjectDrawOrder drawOrder = TiledMapObjectDrawOrder.TopDown, + Vector2? offset = null, Vector2? parallaxFactor = null, float opacity = 1.0f, bool isVisible = true) + : base(name, offset, parallaxFactor, opacity, isVisible) { Color = color; DrawOrder = drawOrder; @@ -17,4 +17,4 @@ namespace MonoGame.Extended.Tiled public TiledMapObjectDrawOrder DrawOrder { get; } public TiledMapObject[] Objects { get; } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs index 9de096b2..3dd63cd3 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapReader.cs @@ -59,7 +59,7 @@ namespace MonoGame.Extended.Tiled map.AddTileset(tileset, firstGlobalIdentifier); } } - + private static TiledMapTileset ReadTileset(ContentReader reader, TiledMap map) { var external = reader.ReadBoolean(); @@ -93,6 +93,9 @@ namespace MonoGame.Extended.Tiled var offsetX = reader.ReadSingle(); var offsetY = reader.ReadSingle(); var offset = new Vector2(offsetX, offsetY); + var parallaxX = reader.ReadSingle(); + var parallaxY = reader.ReadSingle(); + var parallaxFactor = new Vector2(parallaxX, parallaxY); var properties = new TiledMapProperties(); ReadProperties(reader, properties); @@ -102,16 +105,16 @@ namespace MonoGame.Extended.Tiled switch (layerType) { case TiledMapLayerType.ImageLayer: - layer = ReadImageLayer(reader, name, offset, opacity, isVisible); + layer = ReadImageLayer(reader, name, offset, parallaxFactor, opacity, isVisible); break; case TiledMapLayerType.TileLayer: - layer = ReadTileLayer(reader, name, offset, opacity, isVisible, map); + layer = ReadTileLayer(reader, name, offset, parallaxFactor, opacity, isVisible, map); break; case TiledMapLayerType.ObjectLayer: - layer = ReadObjectLayer(reader, name, offset, opacity, isVisible, map); + layer = ReadObjectLayer(reader, name, offset, parallaxFactor, opacity, isVisible, map); break; case TiledMapLayerType.GroupLayer: - layer = new TiledMapGroupLayer(name, ReadGroup(reader, map), offset, opacity, isVisible); + layer = new TiledMapGroupLayer(name, ReadGroup(reader, map), offset, parallaxFactor, opacity, isVisible); break; default: throw new ArgumentOutOfRangeException(); @@ -123,7 +126,7 @@ namespace MonoGame.Extended.Tiled return layer; } - private static TiledMapLayer ReadObjectLayer(ContentReader reader, string name, Vector2 offset, float opacity, bool isVisible, TiledMap map) + private static TiledMapLayer ReadObjectLayer(ContentReader reader, string name, Vector2 offset, Vector2 parallaxFactor, float opacity, bool isVisible, TiledMap map) { var color = reader.ReadColor(); var drawOrder = (TiledMapObjectDrawOrder)reader.ReadByte(); @@ -133,7 +136,7 @@ namespace MonoGame.Extended.Tiled for (var i = 0; i < objectCount; i++) objects[i] = ReadTiledMapObject(reader, map); - return new TiledMapObjectLayer(name, objects, color, drawOrder, offset, opacity, isVisible); + return new TiledMapObjectLayer(name, objects, color, drawOrder, offset, parallaxFactor, opacity, isVisible); } private static TiledMapObject ReadTiledMapObject(ContentReader reader, TiledMap map) @@ -202,16 +205,16 @@ namespace MonoGame.Extended.Tiled return points; } - private static TiledMapImageLayer ReadImageLayer(ContentReader reader, string name, Vector2 offset, float opacity, bool isVisible) + private static TiledMapImageLayer ReadImageLayer(ContentReader reader, string name, Vector2 offset, Vector2 parallaxFactor, float opacity, bool isVisible) { var texture = reader.ReadExternalReference(); var x = reader.ReadSingle(); var y = reader.ReadSingle(); var position = new Vector2(x, y); - return new TiledMapImageLayer(name, texture, position, offset, opacity, isVisible); + return new TiledMapImageLayer(name, texture, position, offset, parallaxFactor, opacity, isVisible); } - private static TiledMapTileLayer ReadTileLayer(ContentReader reader, string name, Vector2 offset, float opacity, bool isVisible, TiledMap map) + private static TiledMapTileLayer ReadTileLayer(ContentReader reader, string name, Vector2 offset, Vector2 parallaxFactor, float opacity, bool isVisible, TiledMap map) { var width = reader.ReadInt32(); var height = reader.ReadInt32(); @@ -219,7 +222,7 @@ namespace MonoGame.Extended.Tiled var tileHeight = map.TileHeight; var tileCount = reader.ReadInt32(); - var layer = new TiledMapTileLayer(name, width, height, tileWidth, tileHeight, offset, opacity, isVisible); + var layer = new TiledMapTileLayer(name, width, height, tileWidth, tileHeight, offset, parallaxFactor, opacity, isVisible); for (var i = 0; i < tileCount; i++) { @@ -233,4 +236,4 @@ namespace MonoGame.Extended.Tiled return layer; } } -} \ No newline at end of file +} diff --git a/src/cs/MonoGame.Extended.Tiled/TiledMapTileLayer.cs b/src/cs/MonoGame.Extended.Tiled/TiledMapTileLayer.cs index 5729f724..32bb1856 100644 --- a/src/cs/MonoGame.Extended.Tiled/TiledMapTileLayer.cs +++ b/src/cs/MonoGame.Extended.Tiled/TiledMapTileLayer.cs @@ -5,8 +5,9 @@ namespace MonoGame.Extended.Tiled { public class TiledMapTileLayer : TiledMapLayer { - public TiledMapTileLayer(string name, int width, int height, int tileWidth, int tileHeight, Vector2? offset = null, float opacity = 1, bool isVisible = true) - : base(name, offset, opacity, isVisible) + public TiledMapTileLayer(string name, int width, int height, int tileWidth, int tileHeight, Vector2? offset = null, + Vector2? parallaxFactor = null, float opacity = 1, bool isVisible = true) + : base(name, offset, parallaxFactor, opacity, isVisible) { Width = width; Height = height; @@ -56,7 +57,7 @@ namespace MonoGame.Extended.Tiled var index = GetTileIndex(x, y); Tiles[index] = new TiledMapTile(globalIdentifier, x, y); } - + public void RemoveTile(ushort x, ushort y) { SetTile(x, y, 0);