diff --git a/Sledgemapper.Shared/Entities/Session.cs b/Sledgemapper.Shared/Entities/Session.cs index ab1faa5..ed5b0c6 100644 --- a/Sledgemapper.Shared/Entities/Session.cs +++ b/Sledgemapper.Shared/Entities/Session.cs @@ -27,6 +27,7 @@ namespace Sledgemapper.Shared.Entities Overlays = new ConcurrentDictionary(); Walls = new ConcurrentDictionary(); Notes = new ConcurrentDictionary(); + Lines=new ConcurrentDictionary(); Players = new List(); Colors = new List(); } @@ -40,6 +41,7 @@ namespace Sledgemapper.Shared.Entities public List Colors { get; set; } public string SessionName { get; set; } public int SessionId { get; set; } + public ConcurrentDictionary Lines { get; private set; } public void NewTile(Tile selectedTile, string tileId) { @@ -179,5 +181,25 @@ namespace Sledgemapper.Shared.Entities { MapEntityDeleted?.Invoke(this, e); } + + public void NewLine(Line line) + { + if (line is null) + { + return; + } + + var lineExist = Lines.TryGetValue(line.ToString(), out var tile); + var newLine = new Line { X = line.X, Y = line.Y,EndX=line.EndX, EndY=line.EndY }; + if (lineExist) + { + Lines.TryRemove(line.ToString(), out var _); + } + + Lines.TryAdd(newLine.ToString(), newLine); + + //TODO fix this + //OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newTile)); + } } } diff --git a/Sledgemapper.Shared/Entities/Tile.cs b/Sledgemapper.Shared/Entities/Tile.cs index 932da5a..2305868 100644 --- a/Sledgemapper.Shared/Entities/Tile.cs +++ b/Sledgemapper.Shared/Entities/Tile.cs @@ -1,21 +1,30 @@ namespace Sledgemapper.Shared.Entities { - public abstract class BaseMapEntity - { - public int X { get; set; } + public abstract class BaseMapEntity + { + public int X { get; set; } public int Y { get; set; } public string ID { get; set; } - public int Rotation { get; set; } - public override string ToString() + public int Rotation { get; set; } + public override string ToString() { return $"{X}_{Y}"; } - public double Timestamp {get;set;} - } + public double Timestamp { get; set; } + } - public class Tile :BaseMapEntity + public class Tile : BaseMapEntity { } - + public class Line : BaseMapEntity + { + public int EndX { get; set; } + public int EndY { get; set; } + + public override string ToString() + { + return $"{X}_{Y}_{EndX}_{EndY}"; + } + } } diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 8366f7c..fc5c206 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -329,6 +329,25 @@ namespace Sledgemapper } } + + if (newState.IsKeyDown(Keys.LeftControl) && newState.IsKeyDown(Keys.LeftShift) + && mouseState.LeftButton == ButtonState.Released + && mouseState.LeftButton != oldMouseState.LeftButton) + { + if (_state.LineStart is null) + { + _state.LineStart = new Tile{X=_state.HoveredTile.X, Y=_state.HoveredTile.Y}; + } + else + { + var line = new Line{X = _state.LineStart.X, Y = _state.LineStart.Y, EndX=_state.HoveredTile.X, EndY=_state.HoveredTile.Y}; + _state.LineStart=null; + _sessionData.NewLine(line); + + + } + } + if (newState.IsKeyDown(Keys.LeftControl) && mouseState.ScrollWheelValue != oldMouseState.ScrollWheelValue) { // var center = new Point(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2); @@ -441,7 +460,7 @@ namespace Sledgemapper _spriteBatch.Begin(transformMatrix: Matrix.CreateTranslation(_viewportCenter)); DrawTiles(); - +DrawLines(); DrawWalls(); DrawOverlays(); DrawNotes(); @@ -766,15 +785,109 @@ namespace Sledgemapper private void DrawTiles() { + // foreach (var tile in _sessionData.Map.Values) + // { + // var content = Content.Load($"tiles/{tile.ID}"); + + // var posX = tile.X * _state.TileSize + _state.TileSize / 2f; + // var posY = tile.Y * _state.TileSize + _state.TileSize / 2f; + + // _spriteBatch.Draw(content, new Vector2(posX, posY), + // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); + // } + + // border pass foreach (var tile in _sessionData.Map.Values) { var content = Content.Load($"tiles/{tile.ID}"); - var posX = tile.X * _state.TileSize + _state.TileSize / 2f; - var posY = tile.Y * _state.TileSize + _state.TileSize / 2f; + var posX = tile.X * _state.TileSize ; + var posY = tile.Y * _state.TileSize ; - _spriteBatch.Draw(content, new Vector2(posX, posY), - null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); + var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); + + _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8),null,Color.White,0,Vector2.Zero,SpriteEffects.None, 1); + // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8), _settings.OverlayTintColor,1); + + // _spriteBatch.Draw(content, new Vector2(posX, posY), + // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); + } + + //inner pass + foreach (var tile in _sessionData.Map.Values) + { + var content = Content.Load($"tiles/{tile.ID}"); + + var posX = tile.X * _state.TileSize ; + var posY = tile.Y * _state.TileSize ; + + + var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + whiteRectangle.SetData(new[] { Color.White }); + + _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX, (int)posY, _state.TileSize, _state.TileSize),null,Color.White,0,Vector2.Zero,SpriteEffects.None, 1); + + // _spriteBatch.DrawRectangle(new Rectangle((int)posX, (int)posY, _state.TileSize, _state.TileSize), _settings.BackgroundColor,1); + + // _spriteBatch.Draw(content, new Vector2(posX, posY), + // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); + } + } + +private void DrawLines() + { + + // border pass + foreach (var tile in _sessionData.Lines.Values) + { + // var content = Content.Load($"tiles/{tile.ID}"); + + var posX = tile.X * _state.TileSize ; + var posY = tile.Y * _state.TileSize ; + + var endposX = tile.EndX * _state.TileSize ; + var endposY = tile.EndY * _state.TileSize ; + + + + + var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); + +_spriteBatch.DrawLine(posX, posY, endposX, endposY,_settings.OverlayTintColor,_state.TileSize+4); + + // _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8),null,Color.White,0,Vector2.Zero,SpriteEffects.None, 1); + // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8), _settings.OverlayTintColor,1); + + // _spriteBatch.Draw(content, new Vector2(posX, posY), + // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); + } + + //inner pass + foreach (var tile in _sessionData.Lines.Values) + { + // var content = Content.Load($"tiles/{tile.ID}"); + + var posX = tile.X * _state.TileSize ; + var posY = tile.Y * _state.TileSize ; + + var endposX = tile.EndX * _state.TileSize ; + var endposY = tile.EndY * _state.TileSize ; + + + + + var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); + +_spriteBatch.DrawLine(posX, posY, endposX, endposY,Color.White,_state.TileSize); + + // _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8),null,Color.White,0,Vector2.Zero,SpriteEffects.None, 1); + // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8), _settings.OverlayTintColor,1); + + // _spriteBatch.Draw(content, new Vector2(posX, posY), + // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); } } diff --git a/Sledgemapper/State.cs b/Sledgemapper/State.cs index 5e85745..9a2ba9a 100644 --- a/Sledgemapper/State.cs +++ b/Sledgemapper/State.cs @@ -15,6 +15,8 @@ namespace Sledgemapper public string CurrentTileId { get; set; } public string CurrentWallId { get; set; } public string CurrentOverlayId { get; set; } + public Tile LineStart { get; internal set; } + public InsertMode InsertMode; public State()