diff --git a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs index caa6e6f..ec14d07 100644 --- a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs @@ -1,7 +1,12 @@ +using Godot; + public class DoorAreaInfo { public DoorDirection Direction; public float Start = 0; public float End = 1; + + public Vector2 StartPosition; + public Vector2 EndPosition; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs index 0f4b386..8a34e5a 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs @@ -17,6 +17,7 @@ //选中点 private bool _hasActivePoint = false; + //选中左/右点 private byte _activePointType = 0; private DoorAreaInfo _activeArea = null; @@ -48,72 +49,86 @@ var mousePosition = GetLocalMousePosition(); var tileSize = TileSet.TileSize; - if (Mathf.Abs(mousePosition.Y - mapRect.Position.Y) <= 5 && mousePosition.X >= mapRect.Position.X && + if (Mathf.Abs(mousePosition.Y - mapRect.Position.Y) <= 8 && mousePosition.X >= mapRect.Position.X && mousePosition.X <= mapRect.Position.X + mapRect.Size.X) //上 { _hover = true; _hoverDirection = DoorDirection.N; - _hoverPoint1 = new Vector2(Approach(mousePosition.X, tileSize.X) - tileSize.X * 2, mapRect.Position.Y); + var mouseOffset = Approach(mousePosition.X, tileSize.X); + _hoverPoint1 = new Vector2(mouseOffset - tileSize.X * 2, mapRect.Position.Y); _hoverPoint2 = new Vector2(_hoverPoint1.X + tileSize.X * 4, _hoverPoint1.Y); + //判断是否能放下新的门 if (_hoverPoint1.X <= mapRect.Position.X || _hoverPoint2.X >= mapRect.Position.X + mapRect.Size.X || CheckDoorCollision(mapRect)) { _canPut = false; + FindHoverPoint(mouseOffset); } else { _canPut = true; + _hasActivePoint = false; + _activeArea = null; } } - else if (Mathf.Abs(mousePosition.X - mapRect.Position.X) <= 5 && mousePosition.Y >= mapRect.Position.Y && + else if (Mathf.Abs(mousePosition.X - mapRect.Position.X) <= 8 && mousePosition.Y >= mapRect.Position.Y && mousePosition.Y <= mapRect.Position.Y + mapRect.Size.Y) //左 { _hover = true; _hoverDirection = DoorDirection.W; - _hoverPoint1 = new Vector2(mapRect.Position.X, Approach(mousePosition.Y, tileSize.Y) - tileSize.Y * 2); + var mouseOffset = Approach(mousePosition.Y, tileSize.Y); + _hoverPoint1 = new Vector2(mapRect.Position.X, mouseOffset - tileSize.Y * 2); _hoverPoint2 = new Vector2(_hoverPoint1.X, _hoverPoint1.Y + tileSize.X * 4); + //判断是否能放下新的门 if (_hoverPoint1.Y <= mapRect.Position.Y || _hoverPoint2.Y >= mapRect.Position.Y + mapRect.Size.Y || CheckDoorCollision(mapRect)) { _canPut = false; + FindHoverPoint(mouseOffset); } else { _canPut = true; } } - else if (Mathf.Abs(mousePosition.Y - (mapRect.Position.Y + mapRect.Size.Y)) <= 5 && + else if (Mathf.Abs(mousePosition.Y - (mapRect.Position.Y + mapRect.Size.Y)) <= 8 && mousePosition.X >= mapRect.Position.X && mousePosition.X <= mapRect.Position.X + mapRect.Size.X) //下 { _hover = true; _hoverDirection = DoorDirection.S; - _hoverPoint1 = new Vector2(Approach(mousePosition.X, tileSize.X) - tileSize.X * 2, + var mouseOffset = Approach(mousePosition.X, tileSize.X); + _hoverPoint1 = new Vector2(mouseOffset - tileSize.X * 2, mapRect.Position.Y + mapRect.Size.Y); _hoverPoint2 = new Vector2(_hoverPoint1.X + tileSize.X * 4, _hoverPoint1.Y); + //判断是否能放下新的门 if (_hoverPoint1.X <= mapRect.Position.X || _hoverPoint2.X >= mapRect.Position.X + mapRect.Size.X || CheckDoorCollision(mapRect)) { _canPut = false; + FindHoverPoint(mouseOffset); } else { _canPut = true; } } - else if (Mathf.Abs(mousePosition.X - (mapRect.Position.X + mapRect.Size.X)) <= 5 && + else if (Mathf.Abs(mousePosition.X - (mapRect.Position.X + mapRect.Size.X)) <= 8 && mousePosition.Y >= mapRect.Position.Y && mousePosition.Y <= mapRect.Position.Y + mapRect.Size.Y) //右 { _hover = true; _hoverDirection = DoorDirection.E; + var mouseOffset = Approach(mousePosition.Y, tileSize.Y); _hoverPoint1 = new Vector2(mapRect.Position.X + mapRect.Size.X, - Approach(mousePosition.Y, tileSize.Y) - tileSize.Y * 2); + mouseOffset - tileSize.Y * 2); _hoverPoint2 = new Vector2(_hoverPoint1.X, _hoverPoint1.Y + tileSize.X * 4); + //判断是否能放下新的门 if (_hoverPoint1.Y <= mapRect.Position.Y || _hoverPoint2.Y >= mapRect.Position.Y + mapRect.Size.Y || CheckDoorCollision(mapRect)) { _canPut = false; + FindHoverPoint(mouseOffset); } else { @@ -124,18 +139,24 @@ { _hover = false; _canPut = false; + _hasActivePoint = false; + _activeArea = null; } - QueueRedraw(); - + //判断是否可以创建新的点 if (isClick && _canPut) { CreateDoorArea(mapRect); } + + QueueRedraw(); } else { _hover = false; + _canPut = false; + _hasActivePoint = false; + _activeArea = null; } } @@ -152,9 +173,9 @@ //绘制悬停 if (_hover) { - if (_canPut) + if (!_hasActivePoint) //这里判断是否悬停在拖动点上 { - var color = new Color(0, 1, 0, 0.2f); + var color = _canPut ? new Color(0, 1, 0, 0.2f) : new Color(1, 0, 0, 0.2f); switch (_hoverDirection) { case DoorDirection.E: @@ -193,6 +214,9 @@ //绘制已经存在的 foreach (var doorAreaInfo in _doorConfigs) { + var flag = _hasActivePoint && _activeArea == doorAreaInfo; + var color3 = (flag && _activePointType == 0) ? new Color(1, 1, 1, 0.8f) : color2; + var color4 = (flag && _activePointType == 1) ? new Color(1, 1, 1, 0.8f) : color2; switch (doorAreaInfo.Direction) { case DoorDirection.E: @@ -203,11 +227,11 @@ doorAreaInfo.End - doorAreaInfo.Start), color2); DrawCircle( new Vector2(mapRange.Position.X + mapRange.Size.X, - mapRange.Position.Y + doorAreaInfo.Start + 2), 5, color2); + mapRange.Position.Y + doorAreaInfo.Start + 2), 5, color3); DrawCircle( new Vector2(mapRange.Position.X + mapRange.Size.X, mapRange.Position.Y + doorAreaInfo.End + 2), - 5, color2); + 5, color4); break; case DoorDirection.W: DrawRect( @@ -215,9 +239,9 @@ new Vector2(mapRange.Position.X - 30, mapRange.Position.Y + doorAreaInfo.Start + 2), 30, doorAreaInfo.End - doorAreaInfo.Start), color2); DrawCircle(new Vector2(mapRange.Position.X, mapRange.Position.Y + doorAreaInfo.Start + 2), 5, - color2); + color3); DrawCircle(new Vector2(mapRange.Position.X, mapRange.Position.Y + doorAreaInfo.End + 2), 5, - color2); + color4); break; case DoorDirection.S: DrawRect( @@ -227,11 +251,11 @@ color2); DrawCircle( new Vector2(mapRange.Position.X + doorAreaInfo.Start + 2, - mapRange.Position.Y + mapRange.Size.Y), 5, color2); + mapRange.Position.Y + mapRange.Size.Y), 5, color3); DrawCircle( new Vector2(mapRange.Position.X + doorAreaInfo.End + 2, mapRange.Position.Y + mapRange.Size.Y), - 5, color2); + 5, color4); break; case DoorDirection.N: DrawRect( @@ -239,9 +263,9 @@ new Vector2(mapRange.Position.X + doorAreaInfo.Start + 2, mapRange.Position.Y - 30), doorAreaInfo.End - doorAreaInfo.Start, 30), color2); DrawCircle(new Vector2(mapRange.Position.X + doorAreaInfo.Start + 2, mapRange.Position.Y), 5, - color2); + color3); DrawCircle(new Vector2(mapRange.Position.X + doorAreaInfo.End + 2, mapRange.Position.Y), 5, - color2); + color4); break; } } @@ -253,6 +277,8 @@ { var doorAreaInfo = new DoorAreaInfo(); doorAreaInfo.Direction = _hoverDirection; + doorAreaInfo.StartPosition = _hoverPoint1; + doorAreaInfo.EndPosition = _hoverPoint2; switch (_hoverDirection) { case DoorDirection.E: @@ -270,6 +296,7 @@ _doorConfigs.Add(doorAreaInfo); } + //检查是否能放下门 private bool CheckDoorCollision(Rect2 mapRect) { foreach (var doorAreaInfo in _doorConfigs) @@ -280,14 +307,14 @@ { case DoorDirection.E: case DoorDirection.W: - if (CheckValueCollision(mapRect.Position.Y + doorAreaInfo.Start, mapRect.Position.Y + doorAreaInfo.End, _hoverPoint1.Y, _hoverPoint2.Y)) + if (CheckValueCollision(doorAreaInfo.StartPosition.Y, doorAreaInfo.EndPosition.Y, _hoverPoint1.Y, _hoverPoint2.Y)) { return true; } break; case DoorDirection.S: case DoorDirection.N: - if (CheckValueCollision(mapRect.Position.X + doorAreaInfo.Start, mapRect.Position.X + doorAreaInfo.End, _hoverPoint1.X, _hoverPoint2.X)) + if (CheckValueCollision(doorAreaInfo.StartPosition.X, doorAreaInfo.EndPosition.X, _hoverPoint1.X, _hoverPoint2.X)) { return true; } @@ -304,6 +331,62 @@ var size = TileSet.TileSize.X; return !(h2 < o1 - 3 * size || o2 + 3 * size < h1); } + + private void FindHoverPoint(float mouseOffset) + { + //检测是否有碰撞的点 + var flag = false; + foreach (var doorAreaInfo in _doorConfigs) + { + if (doorAreaInfo.Direction == _hoverDirection) + { + if (_hoverDirection == DoorDirection.N || _hoverDirection == DoorDirection.S) + { + if (Math.Abs(doorAreaInfo.StartPosition.X - mouseOffset) < 0.0001f) + { + _hasActivePoint = true; + _activePointType = 0; + _activeArea = doorAreaInfo; + flag = true; + break; + } + else if (Math.Abs(doorAreaInfo.EndPosition.X - mouseOffset) < 0.0001f) + { + _hasActivePoint = true; + _activePointType = 1; + _activeArea = doorAreaInfo; + flag = true; + break; + } + } + else + { + if (Math.Abs(doorAreaInfo.StartPosition.Y - mouseOffset) < 0.0001f) + { + _hasActivePoint = true; + _activePointType = 0; + _activeArea = doorAreaInfo; + flag = true; + break; + } + else if (Math.Abs(doorAreaInfo.EndPosition.Y - mouseOffset) < 0.0001f) + { + _hasActivePoint = true; + _activePointType = 1; + _activeArea = doorAreaInfo; + flag = true; + break; + } + } + } + } + + if (!flag) + { + _hasActivePoint = false; + _activeArea = null; + } + } private Rect2 CalcTileRange() {