diff --git a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs index 60dd0a1..e1d2925 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonRoomTemplate.cs @@ -24,6 +24,12 @@ /// public static readonly string RoomTileConfigFile = System.Environment.CurrentDirectory + "\\resource\\map\\RoomConfig.json"; + /// + /// 是否启用编辑模式 + /// + [Export(PropertyHint.None, "是否启用编辑模式")] + public bool EnableEdit = false; + #if TOOLS //是否悬停在线上 private bool _hover = false; @@ -64,13 +70,16 @@ return; } + //加载配置 var initConfigs = false; if (_doorConfigs == null) { initConfigs = true; _doorConfigs = ReadConfig(CalcTileRange(this), Name); + QueueRedraw(); } + //按键检测 var isClick = false; if (Input.IsMouseButtonPressed(MouseButton.Left)) { @@ -86,241 +95,255 @@ isClick = false; } - if (Input.IsMouseButtonPressed(MouseButton.Middle)) //中键移除门 + if (EnableEdit) //启用了编辑功能 { - if (_activeArea != null) - { - RemoveDoorArea(_activeArea); - _hasActivePoint = false; - _activeArea = null; - } - } - else if (TileSet != null) - { - var mapRect = CalcTileRange(this); - var mousePosition = GetLocalMousePosition(); - - if (mapRect != _prevRect) - { - if (!initConfigs) - { - OnMapRectChange(); - } - } - _prevRect = mapRect; - - var tileSize = TileSet.TileSize; - if (_isDrag) //拖拽中 + if (Input.IsMouseButtonPressed(MouseButton.Middle)) //中键移除门 { if (_activeArea != null) { - //拖拽节点操作 - if (_activeArea.Direction == DoorDirection.N || _activeArea.Direction == DoorDirection.S) - { - if (_activePointType == 0) - { - var mouseOffset = Approach(mousePosition.X, tileSize.X); - _activeArea.StartPosition = new Vector2(mouseOffset, _activeArea.StartPosition.Y); - _activeArea.Start = mouseOffset - mapRect.Position.X; - _dragHasCollision = _activeArea.StartPosition.X <= mapRect.Position.X || - _activeArea.StartPosition.X + 3 * tileSize.X >= _activeArea.EndPosition.X || - CheckDoorCollision(_activeArea.Direction, _activeArea); - } - else - { - var mouseOffset = Approach(mousePosition.X, tileSize.X); - _activeArea.EndPosition = new Vector2(mouseOffset, _activeArea.EndPosition.Y); - _activeArea.End = mouseOffset - mapRect.Position.X; - _dragHasCollision = _activeArea.EndPosition.X >= mapRect.Position.X + mapRect.Size.X || - _activeArea.EndPosition.X - 3 * tileSize.X <= _activeArea.StartPosition.X || - CheckDoorCollision(_activeArea.Direction, _activeArea); - } - } - else - { - if (_activePointType == 0) - { - var mouseOffset = Approach(mousePosition.Y, tileSize.Y); - _activeArea.StartPosition = new Vector2(_activeArea.StartPosition.X, mouseOffset); - _activeArea.Start = mouseOffset - mapRect.Position.Y; - _dragHasCollision = _activeArea.StartPosition.Y <= mapRect.Position.Y || - _activeArea.StartPosition.Y + 3 * tileSize.Y >= _activeArea.EndPosition.Y || - CheckDoorCollision(_activeArea.Direction, _activeArea); - } - else - { - var mouseOffset = Approach(mousePosition.Y, tileSize.Y); - _activeArea.EndPosition = new Vector2(_activeArea.EndPosition.X, mouseOffset); - _activeArea.End = mouseOffset - mapRect.Position.Y; - _dragHasCollision = _activeArea.EndPosition.Y >= mapRect.Position.Y + mapRect.Size.Y || - _activeArea.EndPosition.Y - 3 * tileSize.Y <= _activeArea.StartPosition.Y || - CheckDoorCollision(_activeArea.Direction, _activeArea); - } - } - } - } - else - { - 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; - 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()) - { - _canPut = false; - FindHoverPoint(mouseOffset); - } - else - { - _canPut = true; - _hasActivePoint = false; - _activeArea = null; - } - } - 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; - 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()) - { - _canPut = false; - FindHoverPoint(mouseOffset); - } - else - { - _canPut = true; - _hasActivePoint = false; - _activeArea = null; - } - } - 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; - 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()) - { - _canPut = false; - FindHoverPoint(mouseOffset); - } - else - { - _canPut = true; - _hasActivePoint = false; - _activeArea = null; - } - } - 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, - 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()) - { - _canPut = false; - FindHoverPoint(mouseOffset); - } - else - { - _canPut = true; - _hasActivePoint = false; - _activeArea = null; - } - } - else - { - _hover = false; - _canPut = false; + RemoveDoorArea(_activeArea); _hasActivePoint = false; _activeArea = null; } } + else if (TileSet != null) //编辑操作 + { + var mapRect = CalcTileRange(this); + var mousePosition = GetLocalMousePosition(); - if (isClick && _canPut) //判断是否可以创建新的点 - { - CreateDoorArea(mapRect); - } - else if (_mouseDown && !_isDrag) //拖拽节点 - { - _isDrag = true; - _dragHasCollision = false; - if (_activeArea != null) + if (mapRect != _prevRect) { - if (_activePointType == 0) + if (!initConfigs) { - _startDragValue = _activeArea.Start; - _startDragPositionValue = _activeArea.StartPosition; - } - else - { - _startDragValue = _activeArea.End; - _startDragPositionValue = _activeArea.EndPosition; + OnMapRectChange(); } } - } - else if (!_mouseDown && _isDrag) //松开拖拽的点 - { - _isDrag = false; - if (_activeArea != null) //提交拖拽结果 + + _prevRect = mapRect; + + var tileSize = TileSet.TileSize; + if (_isDrag) //拖拽中 { - if (_dragHasCollision) + if (_activeArea != null) { - if (_activePointType == 0) + //拖拽节点操作 + if (_activeArea.Direction == DoorDirection.N || _activeArea.Direction == DoorDirection.S) { - _activeArea.Start = _startDragValue; - _activeArea.StartPosition = _startDragPositionValue; + if (_activePointType == 0) + { + var mouseOffset = Approach(mousePosition.X, tileSize.X); + _activeArea.StartPosition = new Vector2(mouseOffset, _activeArea.StartPosition.Y); + _activeArea.Start = mouseOffset - mapRect.Position.X; + _dragHasCollision = _activeArea.StartPosition.X <= mapRect.Position.X || + _activeArea.StartPosition.X + 3 * tileSize.X >= + _activeArea.EndPosition.X || + CheckDoorCollision(_activeArea.Direction, _activeArea); + } + else + { + var mouseOffset = Approach(mousePosition.X, tileSize.X); + _activeArea.EndPosition = new Vector2(mouseOffset, _activeArea.EndPosition.Y); + _activeArea.End = mouseOffset - mapRect.Position.X; + _dragHasCollision = _activeArea.EndPosition.X >= mapRect.Position.X + mapRect.Size.X || + _activeArea.EndPosition.X - 3 * tileSize.X <= + _activeArea.StartPosition.X || + CheckDoorCollision(_activeArea.Direction, _activeArea); + } } else { - _activeArea.End = _startDragValue; - _activeArea.EndPosition = _startDragPositionValue; + if (_activePointType == 0) + { + var mouseOffset = Approach(mousePosition.Y, tileSize.Y); + _activeArea.StartPosition = new Vector2(_activeArea.StartPosition.X, mouseOffset); + _activeArea.Start = mouseOffset - mapRect.Position.Y; + _dragHasCollision = _activeArea.StartPosition.Y <= mapRect.Position.Y || + _activeArea.StartPosition.Y + 3 * tileSize.Y >= + _activeArea.EndPosition.Y || + CheckDoorCollision(_activeArea.Direction, _activeArea); + } + else + { + var mouseOffset = Approach(mousePosition.Y, tileSize.Y); + _activeArea.EndPosition = new Vector2(_activeArea.EndPosition.X, mouseOffset); + _activeArea.End = mouseOffset - mapRect.Position.Y; + _dragHasCollision = _activeArea.EndPosition.Y >= mapRect.Position.Y + mapRect.Size.Y || + _activeArea.EndPosition.Y - 3 * tileSize.Y <= + _activeArea.StartPosition.Y || + CheckDoorCollision(_activeArea.Direction, _activeArea); + } } } - OnDoorAreaChange(); + } + else + { + 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; + 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()) + { + _canPut = false; + FindHoverPoint(mouseOffset); + } + else + { + _canPut = true; + _hasActivePoint = false; + _activeArea = null; + } + } + 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; + 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()) + { + _canPut = false; + FindHoverPoint(mouseOffset); + } + else + { + _canPut = true; + _hasActivePoint = false; + _activeArea = null; + } + } + 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; + 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()) + { + _canPut = false; + FindHoverPoint(mouseOffset); + } + else + { + _canPut = true; + _hasActivePoint = false; + _activeArea = null; + } + } + 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, + 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()) + { + _canPut = false; + FindHoverPoint(mouseOffset); + } + else + { + _canPut = true; + _hasActivePoint = false; + _activeArea = null; + } + } + else + { + _hover = false; + _canPut = false; + _hasActivePoint = false; + _activeArea = null; + } } - _dragHasCollision = false; + if (isClick && _canPut) //判断是否可以创建新的点 + { + CreateDoorArea(mapRect); + } + else if (_mouseDown && !_isDrag) //拖拽节点 + { + _isDrag = true; + _dragHasCollision = false; + if (_activeArea != null) + { + if (_activePointType == 0) + { + _startDragValue = _activeArea.Start; + _startDragPositionValue = _activeArea.StartPosition; + } + else + { + _startDragValue = _activeArea.End; + _startDragPositionValue = _activeArea.EndPosition; + } + } + } + else if (!_mouseDown && _isDrag) //松开拖拽的点 + { + _isDrag = false; + if (_activeArea != null) //提交拖拽结果 + { + if (_dragHasCollision) + { + if (_activePointType == 0) + { + _activeArea.Start = _startDragValue; + _activeArea.StartPosition = _startDragPositionValue; + } + else + { + _activeArea.End = _startDragValue; + _activeArea.EndPosition = _startDragPositionValue; + } + } + + OnDoorAreaChange(); + } + + _dragHasCollision = false; + } + + QueueRedraw(); } - - QueueRedraw(); + else + { + ClearState(); + } } else { - _hover = false; - _canPut = false; - _hasActivePoint = false; - _activeArea = null; + ClearState(); } //按下 ctrl + s 保存 @@ -473,6 +496,14 @@ } } + private void ClearState() + { + _hover = false; + _canPut = false; + _hasActivePoint = false; + _activeArea = null; + } + //创建门 private void CreateDoorArea(Rect2 mapRect) { diff --git a/DungeonShooting_Godot/src/framework/map/DungeonTile.cs b/DungeonShooting_Godot/src/framework/map/DungeonTile.cs index ade5c71..8dac660 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonTile.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonTile.cs @@ -20,6 +20,10 @@ /// TileMap 上层的层级 /// public const int TopMapLayer = 2; + /// + /// 连接房间的过道的地板层级 + /// + public const int AisleFloorLayer = 3; /// /// 配置层级的自定义数据名称 @@ -135,11 +139,11 @@ if (dir == 0) //横向 { - FullHorizontalGalleryWall(config, rect, 0); + FullHorizontalAisleWall(config, rect, 0); } else //纵向 { - FullVerticalGalleryWall(config, rect, 0); + FullVerticalAisleWall(config, rect, 0); } } else //带交叉点 @@ -236,26 +240,26 @@ break; } - FillRect(FloorMapLayer, config.Floor, doorInfo.Cross + Vector2.One, + FillRect(AisleFloorLayer, config.Floor, doorInfo.Cross + Vector2.One, new Vector2(GenerateDungeon.CorridorWidth - 2, GenerateDungeon.CorridorWidth - 2)); //墙壁, 0横向, 1纵向 if (dir1 == 0) { - FullHorizontalGalleryWall(config, rect, doorDir1 == DoorDirection.W ? 1: 2); + FullHorizontalAisleWall(config, rect, doorDir1 == DoorDirection.W ? 1: 2); } else { - FullVerticalGalleryWall(config, rect, doorDir1 == DoorDirection.N ? 1: 2); + FullVerticalAisleWall(config, rect, doorDir1 == DoorDirection.N ? 1 : 2); } if (dir2 == 0) { - FullHorizontalGalleryWall(config, rect2, doorDir2 == DoorDirection.W ? 1: 2); + FullHorizontalAisleWall(config, rect2, doorDir2 == DoorDirection.W ? 1 : 2); } else { - FullVerticalGalleryWall(config, rect2, doorDir2 == DoorDirection.N ? 1: 2); + FullVerticalAisleWall(config, rect2, doorDir2 == DoorDirection.N ? 1 : 2); } if ((doorDir1 == DoorDirection.N && doorDir2 == DoorDirection.E) || //↑→ @@ -377,42 +381,42 @@ } } } - - private void FullHorizontalGalleryWall(AutoTileConfig config, Rect2 rect, int type) + + private void FullHorizontalAisleWall(AutoTileConfig config, Rect2 rect, int type) { - FillRect(FloorMapLayer, config.Floor, rect.Position + new Vector2(0, 1), rect.Size - new Vector2(0, 2)); + FillRect(AisleFloorLayer, config.Floor, rect.Position + new Vector2(0, 1), rect.Size - new Vector2(0, 2)); FillRect(MiddleMapLayer, config.T, rect.Position, new Vector2(rect.Size.X, 1)); FillRect(TopMapLayer, config.B, rect.Position + new Vector2(0, rect.Size.Y - 1), new Vector2(rect.Size.X, 1)); //左 ClearRect(TopMapLayer, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.Y - 2)); if (type == 1) { - FillRect(FloorMapLayer, config.Floor, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.Y - 2)); + FillRect(AisleFloorLayer, config.Floor, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.Y - 2)); } //右 ClearRect(TopMapLayer, rect.Position + new Vector2(rect.Size.X, 1), new Vector2(1, rect.Size.Y - 2)); if (type == 2) { - FillRect(FloorMapLayer, config.Floor, rect.Position + new Vector2(rect.Size.X, 1), new Vector2(1, rect.Size.Y - 2)); + FillRect(AisleFloorLayer, config.Floor, rect.Position + new Vector2(rect.Size.X, 1), new Vector2(1, rect.Size.Y - 2)); } } - private void FullVerticalGalleryWall(AutoTileConfig config, Rect2 rect, int type) + private void FullVerticalAisleWall(AutoTileConfig config, Rect2 rect, int type) { - FillRect(FloorMapLayer, config.Floor, rect.Position + new Vector2(1, 0), rect.Size - new Vector2(2, 0)); + FillRect(AisleFloorLayer, config.Floor, rect.Position + new Vector2(1, 0), rect.Size - new Vector2(2, 0)); FillRect(TopMapLayer, config.L, rect.Position, new Vector2(1, rect.Size.Y)); FillRect(TopMapLayer, config.R, rect.Position + new Vector2(rect.Size.X - 1, 0), new Vector2(1, rect.Size.Y)); //上 ClearRect(TopMapLayer, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.X - 2, 1)); if (type == 1) { - FillRect(FloorMapLayer, config.Floor, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.X - 2, 1)); + FillRect(AisleFloorLayer, config.Floor, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.X - 2, 1)); } //下 ClearRect(MiddleMapLayer, rect.Position + new Vector2(1, rect.Size.Y), new Vector2(rect.Size.X - 2, 1)); if (type == 2) { - FillRect(FloorMapLayer, config.Floor, rect.Position + new Vector2(1, rect.Size.Y), new Vector2(rect.Size.X - 2, 1)); + FillRect(AisleFloorLayer, config.Floor, rect.Position + new Vector2(1, rect.Size.Y), new Vector2(rect.Size.X - 2, 1)); } } @@ -432,6 +436,9 @@ /// public void GenerateNavigationPolygon(int layer) { + _usePoints.Clear(); + _polygonDataList.Clear(); + var size = new Vector2(_tileRoot.CellQuadrantSize, _tileRoot.CellQuadrantSize); var rect = _tileRoot.GetUsedRect(); diff --git a/DungeonShooting_Godot/src/game/room/RoomManager.cs b/DungeonShooting_Godot/src/game/room/RoomManager.cs index 448f6ed..0f891f8 100644 --- a/DungeonShooting_Godot/src/game/room/RoomManager.cs +++ b/DungeonShooting_Godot/src/game/room/RoomManager.cs @@ -60,7 +60,7 @@ _dungeonTile.AutoFillRoomTile(_autoTileConfig, _generateDungeon.StartRoom); //生成寻路网格 - _dungeonTile.GenerateNavigationPolygon(DungeonTile.FloorMapLayer); + _dungeonTile.GenerateNavigationPolygon(DungeonTile.AisleFloorLayer); //挂载导航区域 _dungeonTile.MountNavigationPolygon(this); GD.Print("生成地牢用时: " + (DateTime.Now.Ticks - nowTicks) / 10000 + "毫秒");