diff --git a/Sledgemapper.Shared/Entities/Session.cs b/Sledgemapper.Shared/Entities/Session.cs index ed5b0c6..04626e9 100644 --- a/Sledgemapper.Shared/Entities/Session.cs +++ b/Sledgemapper.Shared/Entities/Session.cs @@ -190,7 +190,7 @@ namespace Sledgemapper.Shared.Entities } 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 }; + var newLine = new Line { Start=line.Start, End=line.End}; if (lineExist) { Lines.TryRemove(line.ToString(), out var _); diff --git a/Sledgemapper.Shared/Entities/Tile.cs b/Sledgemapper.Shared/Entities/Tile.cs index b5a947c..12c23d4 100644 --- a/Sledgemapper.Shared/Entities/Tile.cs +++ b/Sledgemapper.Shared/Entities/Tile.cs @@ -19,12 +19,13 @@ public class Line : BaseMapEntity { - public int EndX { get; set; } - public int EndY { get; set; } + public SnapPoint Start { get; set; } + public SnapPoint End { get; set; } + public override string ToString() { - return $"{X}_{Y}_{EndX}_{EndY}"; + return $"{Start.X}_{Start.Y}_{Start.Index}_{End.X}_{End.Y}_{End.Index}"; } } diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 84685fe..b79a5d6 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -151,24 +151,24 @@ namespace Sledgemapper private void OnBtnToolbarWallClicked(object sender, EventArgs e) { - _state.InsertMode=InsertMode.NewWall; + _state.InsertMode = InsertMode.NewWall; } private void OnBtnToolbarTileClicked(object sender, EventArgs e) { - _state.InsertMode=InsertMode.NewTile; - + _state.InsertMode = InsertMode.NewTile; + } private void OnBtnToolbarRoomClicked(object sender, EventArgs e) { - _state.InsertMode=InsertMode.NewRoom; + _state.InsertMode = InsertMode.NewRoom; } private void OnBtnToolbarLinClicked(object sender, EventArgs e) { - _state.InsertMode=InsertMode.NewLine; + _state.InsertMode = InsertMode.NewLine; } private void OneMenuFileSettingsSelected(object sender, EventArgs e) @@ -272,7 +272,7 @@ namespace Sledgemapper _state.SelectOverlay(screenPosition); } - if (_state.InsertMode == InsertMode.NewLine) + if (_state.InsertMode == InsertMode.NewLine) { _state.SelectClosestSnapPoint(screenPosition); } @@ -361,22 +361,26 @@ namespace Sledgemapper } - if (newState.IsKeyDown(Keys.LeftControl) && newState.IsKeyDown(Keys.LeftShift) + if (_state.InsertMode == InsertMode.NewLine && newState.IsKeyDown(Keys.LeftControl) && 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 (_state.LineStart is null) + { + _state.LineStart = new SnapPoint { X = _state.SelectedSnapPoint.X, Y = _state.SelectedSnapPoint.Y, Index=_state.SelectedSnapPoint.Index }; + } + else + { + var line = new Line + { + Start = new SnapPoint { X = _state.LineStart.X, Y = _state.LineStart.Y, Index = _state.LineStart.Index }, + End = new SnapPoint { X = _state.SelectedSnapPoint.X, Y = _state.SelectedSnapPoint.Y, Index = _state.SelectedSnapPoint.Index } + }; + _state.LineStart = null; + _sessionData.NewLine(line); - } + + } } if (newState.IsKeyDown(Keys.LeftControl) && mouseState.ScrollWheelValue != oldMouseState.ScrollWheelValue) @@ -491,7 +495,7 @@ namespace Sledgemapper _spriteBatch.Begin(transformMatrix: Matrix.CreateTranslation(_viewportCenter)); DrawTiles(); -DrawLines(); + DrawLines(); DrawWalls(); DrawOverlays(); DrawNotes(); @@ -562,18 +566,44 @@ DrawLines(); DrawPlayers(); - var startWall = new Vector2(_state.SelectedWall.X * _state.TileSize, _state.SelectedWall.Y * _state.TileSize); if (_state.InsertMode == InsertMode.Wall) { + var startWall = new Vector2(_state.SelectedWall.X * _state.TileSize, _state.SelectedWall.Y * _state.TileSize); _spriteBatch.DrawLine(startWall, _state.TileSize, MathHelper.ToRadians(90 * _state.SelectedWall.Rotation), Color.Red, 2); } - var overlay = new Vector2(_state.SelectedOverlay.X * _state.TileSize, _state.SelectedOverlay.Y * _state.TileSize); if (_state.InsertMode == InsertMode.Overlay && _state.SelectedOverlay.Intersection) { + var overlay = new Vector2(_state.SelectedOverlay.X * _state.TileSize, _state.SelectedOverlay.Y * _state.TileSize); _spriteBatch.DrawCircle(overlay, _state.TileSize / 3f, 100, Color.Red, 2); } + if (_state.InsertMode == InsertMode.NewLine && _state.SelectedSnapPoint != null) + { + var snapPoint = new Vector2(_state.SelectedSnapPoint.X * _state.TileSize, _state.SelectedSnapPoint.Y * _state.TileSize); + + switch (_state.SelectedSnapPoint.Index) + { + case 1: + break; + case 2: + snapPoint.X += _state.TileSize / 2; + break; + case 3: + snapPoint.Y += _state.TileSize / 2; + break; + case 4: + snapPoint.Y += _state.TileSize / 2; + snapPoint.X += _state.TileSize / 2; + break; + + + + } + + _spriteBatch.DrawCircle(snapPoint, _state.TileSize / 5f, 100, Color.Red, 2); + } + _spriteBatch.End(); try @@ -832,13 +862,13 @@ DrawLines(); { var content = Content.Load($"tiles/{tile.ID}"); - var posX = tile.X * _state.TileSize ; - var posY = tile.Y * _state.TileSize ; + var posX = tile.X * _state.TileSize; + var posY = tile.Y * _state.TileSize; - var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); - whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); + 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.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), @@ -850,14 +880,14 @@ DrawLines(); { var content = Content.Load($"tiles/{tile.ID}"); - var posX = tile.X * _state.TileSize ; - var posY = tile.Y * _state.TileSize ; + var posX = tile.X * _state.TileSize; + var posY = tile.Y * _state.TileSize; - var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); - whiteRectangle.SetData(new[] { Color.White }); + 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.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); @@ -866,28 +896,68 @@ DrawLines(); } } -private void DrawLines() + private void DrawLines() { - + var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); + // 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 posX = tile.Start.X * _state.TileSize; + var posY = tile.Start.Y * _state.TileSize; - var endposX = tile.EndX * _state.TileSize ; - var endposY = tile.EndY * _state.TileSize ; + var endposX = tile.End.X * _state.TileSize; + var endposY = tile.End.Y * _state.TileSize; + + switch (tile.Start.Index) + { + case 1: + break; + case 2: + posX += _state.TileSize / 2; + break; + case 3: + posY += _state.TileSize / 2; + + break; + case 4: + posX += _state.TileSize / 2; + posY += _state.TileSize / 2; + break; + } + + switch (tile.End.Index) + { + case 1: + break; + case 2: + endposX += _state.TileSize / 2; + break; + case 3: + endposY += _state.TileSize / 2; + + break; + case 4: + endposX += _state.TileSize / 2; + endposY += _state.TileSize / 2; + break; + } + + + + + // _spriteBatch.DrawLine(posX, posY, endposX, endposY, _settings.OverlayTintColor, _state.TileSize + 4); + var l = Math.Sqrt(Math.Pow(posX-endposX,2) + Math.Pow(posY-endposY,2)); - var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); - whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); - -_spriteBatch.DrawLine(posX, posY, endposX, endposY,_settings.OverlayTintColor,_state.TileSize+4); - + var angle =Math.Atan2(posY-endposY, endposX-posX); + var angleRad = -(float)angle;//MathHelper.ToRadians((float)angle); +_spriteBatch.Draw(whiteRectangle, new Rectangle(posX, posY,(int)l , _state.TileSize+8), null,Color.White,angleRad,Vector2.Zero,SpriteEffects.None,1 ); // _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); @@ -896,30 +966,63 @@ _spriteBatch.DrawLine(posX, posY, endposX, endposY,_settings.OverlayTintColor,_s } //inner pass - foreach (var tile in _sessionData.Lines.Values) - { - // var content = Content.Load($"tiles/{tile.ID}"); + // 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 posX = tile.Start.X * _state.TileSize; + // var posY = tile.Start.Y * _state.TileSize; - var endposX = tile.EndX * _state.TileSize ; - var endposY = tile.EndY * _state.TileSize ; + // var endposX = tile.End.X * _state.TileSize; + // var endposY = tile.End.Y * _state.TileSize; + + // switch (tile.Start.Index) + // { + // case 1: + // break; + // case 2: + // posX += _state.TileSize / 2; + // break; + // case 3: + // posY += _state.TileSize / 2; + + // break; + // case 4: + // posX += _state.TileSize / 2; + // posY += _state.TileSize / 2; + // break; + // } + + // switch (tile.End.Index) + // { + // case 1: + // break; + // case 2: + // endposX += _state.TileSize / 2; + // break; + // case 3: + // endposY += _state.TileSize / 2; + + // break; + // case 4: + // endposX += _state.TileSize / 2; + // endposY += _state.TileSize / 2; + // break; + // } + // var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + // whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); - var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); - whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); + // _spriteBatch.DrawLine(posX, posY, endposX, endposY, Color.White, _state.TileSize); -_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(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); - } + // // _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 DrawWalls() diff --git a/Sledgemapper/State.cs b/Sledgemapper/State.cs index 62fa4d9..119b341 100644 --- a/Sledgemapper/State.cs +++ b/Sledgemapper/State.cs @@ -17,7 +17,7 @@ namespace Sledgemapper public string CurrentTileId { get; set; } public string CurrentWallId { get; set; } public string CurrentOverlayId { get; set; } - public Tile LineStart { get; internal set; } + public SnapPoint LineStart { get; internal set; } public InsertMode InsertMode; @@ -68,136 +68,54 @@ namespace Sledgemapper } } + public bool CheckDistance(Point p1, Point p2, float d) + { + return ((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y)) < d * d; + } + + public void SelectClosestSnapPoint(Point mousePosition) { - Math.DivRem(mousePosition.X, TileSize / 2, out var remx); - Math.DivRem(mousePosition.Y, TileSize / 2, out var remy); - //var snaptileY=mousePosition.Y/(TileSize/2f); - Console.WriteLine($"{remx} _ {remy}"); + var distance = TileSize / 4; - if (remx == 0) + if (CheckDistance(mousePosition, new Point(HoveredTile.X * TileSize, HoveredTile.Y * TileSize), distance)) //x y { - if (remy == 0) - { - SelectedSnapPoint.X = HoveredTile.X; - SelectedSnapPoint.Y = HoveredTile.Y; - SelectedSnapPoint.Index = 1; - } - else if (remy < 8) - { - SelectedSnapPoint.X = HoveredTile.X; - SelectedSnapPoint.Y = HoveredTile.Y; - SelectedSnapPoint.Index = 3; - } - else - { - SelectedSnapPoint.X = HoveredTile.X; - SelectedSnapPoint.Y = HoveredTile.Y+1; - SelectedSnapPoint.Index = 1; - } + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X, Y = HoveredTile.Y, Index = 1 }; } - - else if (remx <8) + else if (CheckDistance(mousePosition, new Point(HoveredTile.X * TileSize + TileSize / 2, HoveredTile.Y * TileSize + TileSize / 2), distance)) // x+1/2, y+1/2 { - if (remy == 0) - { - SelectedSnapPoint.X = HoveredTile.X; - SelectedSnapPoint.Y = HoveredTile.Y; - SelectedSnapPoint.Index = 2; - } - else if (remy < 8) - { - SelectedSnapPoint.X = HoveredTile.X; - SelectedSnapPoint.Y = HoveredTile.Y; - SelectedSnapPoint.Index = 4; - } - else - { - SelectedSnapPoint.X = HoveredTile.X; - SelectedSnapPoint.Y = HoveredTile.Y+1; - SelectedSnapPoint.Index = 2; - } + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X, Y = HoveredTile.Y, Index = 4 }; } - else{ - if (remy == 0) - { - SelectedSnapPoint.X = HoveredTile.X+1; - SelectedSnapPoint.Y = HoveredTile.Y; - SelectedSnapPoint.Index = 1; - } - else if (remy < 8) - { - SelectedSnapPoint.X = HoveredTile.X+1; - SelectedSnapPoint.Y = HoveredTile.Y; - SelectedSnapPoint.Index = 3; - } - else - { - SelectedSnapPoint.X = HoveredTile.X+1; - SelectedSnapPoint.Y = HoveredTile.Y+1; - SelectedSnapPoint.Index = 1; - } + else if (CheckDistance(mousePosition, new Point((HoveredTile.X + 1) * TileSize, HoveredTile.Y * TileSize), distance)) //x+1,y + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X + 1, Y = HoveredTile.Y, Index = 1 }; } - - - - // SelectedSnapPoint.X = HoveredTile.X; - // SelectedSnapPoint.Y = HoveredTile.Y; - - // var points = new List{ - // new Point(HoveredTile.X * TileSize, HoveredTile.Y * TileSize), - // new Point((HoveredTile.X+1) * TileSize, HoveredTile.Y * TileSize), - // new Point((HoveredTile.X+1) * TileSize, (HoveredTile.Y+1) * TileSize), - // new Point(HoveredTile.X * TileSize, (HoveredTile.Y+1) * TileSize), - // new Point(HoveredTile.X * TileSize+TileSize/2, HoveredTile.Y * TileSize), - // new Point(HoveredTile.X * TileSize + TileSize/2, HoveredTile.Y * TileSize+ TileSize/2), - // new Point(HoveredTile.X * TileSize, HoveredTile.Y * TileSize+TileSize/2), - // new Point(HoveredTile.X * TileSize+TileSize , HoveredTile.Y * TileSize+TileSize/2), - // new Point(HoveredTile.X * TileSize+TileSize/2, HoveredTile.Y * TileSize+TileSize) - // }; - - // var q1 = Math.Pow(mousePosition.X - HoveredTile.X * TileSize, 2); - // var q2 = Math.Pow(HoveredTile.Y * TileSize - mousePosition.Y, 2); - // var s = Math.Sqrt(q1 + q2); - - // if (s < TileSize / 3) - // { - // SelectedOverlay.Intersection = true; - // return; - // } - - // q1 = Math.Pow(mousePosition.X - (HoveredTile.X + 1) * TileSize, 2); - // s = Math.Sqrt(q1 + q2); - // if (s < TileSize / 3) - // { - // SelectedOverlay.X = SelectedOverlay.X + 1; - // SelectedOverlay.Intersection = true; - // return; - // } - - // //q1 = System.Math.Pow(mousePosition.X - (_hoveredTile.X + 1) * _tileSize, 2); - // q2 = Math.Pow((HoveredTile.Y + 1) * TileSize - mousePosition.Y, 2); - // s = Math.Sqrt(q1 + q2); - // if (s < TileSize / 3) - // { - // SelectedOverlay.X = SelectedOverlay.X + 1; - // SelectedOverlay.Y = SelectedOverlay.Y + 1; - // SelectedOverlay.Intersection = true; - // return; - // } - - // q1 = Math.Pow(mousePosition.X - HoveredTile.X * TileSize, 2); - // q2 = Math.Pow((HoveredTile.Y + 1) * TileSize - mousePosition.Y, 2); - // s = Math.Sqrt(q1 + q2); - // if (s < TileSize / 3) - // { - // SelectedOverlay.X = SelectedOverlay.X; - // SelectedOverlay.Y = SelectedOverlay.Y + 1; - // SelectedOverlay.Intersection = true; - // return; - // } - - // SelectedOverlay.Intersection = false; + else if (CheckDistance(mousePosition, new Point((HoveredTile.X + 1) * TileSize, (HoveredTile.Y + 1) * TileSize), distance)) //x+1, y+1 + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X + 1, Y = HoveredTile.Y + 1, Index = 1 }; + } + else if (CheckDistance(mousePosition, new Point((HoveredTile.X) * TileSize, (HoveredTile.Y + 1) * TileSize), distance))//x,y+1 + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X, Y = HoveredTile.Y + 1, Index = 1 }; + } + else if (CheckDistance(mousePosition, new Point(HoveredTile.X * TileSize, HoveredTile.Y * TileSize + TileSize / 2), distance)) //x, x+1/2 + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X, Y = HoveredTile.Y, Index = 3 }; + } + else if (CheckDistance(mousePosition, new Point(HoveredTile.X * TileSize + TileSize / 2, HoveredTile.Y * TileSize ), distance)) // x+1/2,y + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X, Y = HoveredTile.Y, Index = 2 }; + } + else if (CheckDistance(mousePosition, new Point(HoveredTile.X * TileSize + TileSize, HoveredTile.Y * TileSize + TileSize / 2), distance)) // x+1/2, y+1/2 + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X+1, Y = HoveredTile.Y, Index = 3 }; + } + else if (CheckDistance(mousePosition, new Point(HoveredTile.X * TileSize + TileSize / 2, HoveredTile.Y * TileSize + TileSize ), distance)) // x+1/2, y+1/2 + { + SelectedSnapPoint = new SnapPoint { X = HoveredTile.X, Y = HoveredTile.Y+1, Index = 2 }; + } + + } public void SelectOverlay(Point mousePosition) {