diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn index 6531b94..d4d4e18 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=6 format=3 uid="uid://b4u66mxndxbrg"] +[gd_scene load_steps=7 format=3 uid="uid://b4u66mxndxbrg"] [ext_resource type="Script" path="res://src/game/ui/mapEditorTools/MapEditorToolsPanel.cs" id="1_mqp1c"] +[ext_resource type="Script" path="res://src/game/ui/mapEditorTools/DoorHoverArea.cs" id="2_6qfy3"] [ext_resource type="Texture2D" uid="uid://uhhfgdhpk7i4" path="res://icon.png" id="2_rwvbg"] [ext_resource type="Script" path="res://src/game/ui/mapEditorTools/DoorDragArea.cs" id="3_3w0w6"] [ext_resource type="Script" path="res://src/game/ui/mapEditorTools/DoorDragButton.cs" id="3_45muq"] @@ -16,6 +17,134 @@ mouse_filter = 1 script = ExtResource("1_mqp1c") +[node name="DoorToolRoot" type="Control" parent="."] +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="N_HoverRoot" type="Control" parent="DoorToolRoot"] +anchors_preset = 0 + +[node name="N_HoverArea" type="ColorRect" parent="DoorToolRoot/N_HoverRoot"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -36.0 +offset_right = 160.0 +grow_vertical = 0 +color = Color(1, 1, 1, 0) +script = ExtResource("2_6qfy3") + +[node name="E_HoverRoot" type="Control" parent="DoorToolRoot"] +anchors_preset = 0 +rotation = 1.5708 + +[node name="E_HoverArea" type="ColorRect" parent="DoorToolRoot/E_HoverRoot"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -36.0 +offset_right = 160.0 +grow_vertical = 0 +color = Color(1, 1, 1, 0) +script = ExtResource("2_6qfy3") + +[node name="S_HoverRoot" type="Control" parent="DoorToolRoot"] +anchors_preset = 0 +rotation = 3.14159 +scale = Vector2(-1, 1) + +[node name="S_HoverArea" type="ColorRect" parent="DoorToolRoot/S_HoverRoot"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -36.0 +offset_right = 160.0 +grow_vertical = 0 +color = Color(1, 1, 1, 0) +script = ExtResource("2_6qfy3") + +[node name="W_HoverRoot" type="Control" parent="DoorToolRoot"] +anchors_preset = 0 +rotation = 4.71239 +scale = Vector2(-1, 1) + +[node name="W_HoverArea" type="ColorRect" parent="DoorToolRoot/W_HoverRoot"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -36.0 +offset_right = 160.0 +grow_vertical = 0 +color = Color(1, 1, 1, 0) +script = ExtResource("2_6qfy3") + +[node name="HoverPrevRoot" type="Control" parent="DoorToolRoot"] +anchors_preset = 0 +mouse_filter = 2 + +[node name="HoverPrev" type="TextureRect" parent="DoorToolRoot/HoverPrevRoot"] +layout_mode = 1 +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -1.5 +offset_top = -36.0 +offset_right = 1.5 +grow_horizontal = 2 +grow_vertical = 0 +mouse_filter = 2 +texture = ExtResource("3_trbb5") + +[node name="DoorToolTemplate" type="Control" parent="DoorToolRoot"] +anchors_preset = 0 +script = ExtResource("3_3w0w6") + +[node name="DoorArea" type="ColorRect" parent="DoorToolRoot/DoorToolTemplate"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -32.0 +offset_right = 64.0 +grow_vertical = 0 +color = Color(0.184314, 1, 0.0392157, 0.188235) + +[node name="StartBtn" type="TextureButton" parent="DoorToolRoot/DoorToolTemplate"] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -3.0 +offset_top = -36.0 +grow_horizontal = 0 +grow_vertical = 0 +mouse_filter = 1 +texture_normal = ExtResource("3_trbb5") +stretch_mode = 0 +script = ExtResource("3_45muq") + +[node name="EndBtn" type="TextureButton" parent="DoorToolRoot/DoorToolTemplate"] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 64.0 +offset_top = -36.0 +offset_right = 67.0 +grow_vertical = 0 +texture_normal = ExtResource("3_trbb5") +stretch_mode = 0 +script = ExtResource("3_45muq") + [node name="HBoxContainer" type="HBoxContainer" parent="."] layout_mode = 1 anchors_preset = 1 @@ -50,45 +179,3 @@ texture_normal = ExtResource("2_rwvbg") texture_pressed = ExtResource("2_rwvbg") texture_hover = ExtResource("2_rwvbg") - -[node name="DoorToolTemplate" type="Control" parent="."] -anchors_preset = 0 -script = ExtResource("3_3w0w6") - -[node name="DoorArea" type="ColorRect" parent="DoorToolTemplate"] -layout_mode = 1 -anchors_preset = 2 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_top = -32.0 -offset_right = 64.0 -grow_vertical = 0 -color = Color(0.184314, 1, 0.0392157, 0.188235) - -[node name="StartBtn" type="TextureButton" parent="DoorToolTemplate"] -layout_mode = 1 -anchors_preset = 3 -anchor_left = 1.0 -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = -2.0 -offset_top = -36.0 -grow_horizontal = 0 -grow_vertical = 0 -texture_normal = ExtResource("3_trbb5") -stretch_mode = 0 -script = ExtResource("3_45muq") - -[node name="EndBtn" type="TextureButton" parent="DoorToolTemplate"] -layout_mode = 1 -anchors_preset = 2 -anchor_top = 1.0 -anchor_bottom = 1.0 -offset_left = 64.0 -offset_top = -36.0 -offset_right = 66.0 -grow_vertical = 0 -texture_normal = ExtResource("3_trbb5") -stretch_mode = 0 -script = ExtResource("3_45muq") diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001.png.import index b20c9a6..c36be94 100644 --- a/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001.png.import +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://chd2vtesap5cf" -path="res://.godot/imported/enemy0001.png-1247a3ddf8a1a163d812cad12c4340fd.ctex" +path="res://.godot/imported/Enemy0001.png-148a38dfa95953b26d890356e8875de4.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resource/sprite/role/enemy0001/enemy0001.png" -dest_files=["res://.godot/imported/enemy0001.png-1247a3ddf8a1a163d812cad12c4340fd.ctex"] +source_file="res://resource/sprite/role/enemy0001/Enemy0001.png" +dest_files=["res://.godot/imported/Enemy0001.png-148a38dfa95953b26d890356e8875de4.ctex"] [params] diff --git a/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001_Debris.png.import b/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001_Debris.png.import index 56388a2..d563acf 100644 --- a/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001_Debris.png.import +++ b/DungeonShooting_Godot/resource/sprite/role/enemy0001/enemy0001_Debris.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://d2f55lu60x64i" -path="res://.godot/imported/enemy0001_Debris.png-297a2fb6680cb862a9a085cf58f8268c.ctex" +path="res://.godot/imported/Enemy0001_Debris.png-ac416dc79cd3c1217b27e1ef1fbe0d0b.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://resource/sprite/role/enemy0001/enemy0001_Debris.png" -dest_files=["res://.godot/imported/enemy0001_Debris.png-297a2fb6680cb862a9a085cf58f8268c.ctex"] +source_file="res://resource/sprite/role/enemy0001/Enemy0001_Debris.png" +dest_files=["res://.godot/imported/Enemy0001_Debris.png-ac416dc79cd3c1217b27e1ef1fbe0d0b.ctex"] [params] diff --git a/DungeonShooting_Godot/src/framework/common/Utils.cs b/DungeonShooting_Godot/src/framework/common/Utils.cs index 765ece3..2148b40 100644 --- a/DungeonShooting_Godot/src/framework/common/Utils.cs +++ b/DungeonShooting_Godot/src/framework/common/Utils.cs @@ -158,9 +158,10 @@ /// public static bool IsPositionOver(this Control control, Vector2 position) { - var rect = control.GetRect(); - return position.X >= rect.Position.X && position.X <= rect.End.X && - position.Y >= rect.Position.Y && position.Y <= rect.End.Y; + var globalPosition = control.GlobalPosition; + var size = control.Size * control.Scale; + return position.X >= globalPosition.X && position.X <= (globalPosition.X + size.X) && + position.Y >= globalPosition.Y && position.Y <= (globalPosition.Y + size.Y); } diff --git a/DungeonShooting_Godot/src/framework/map/data/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/data/DoorAreaInfo.cs index 8d2263c..0ee84b0 100644 --- a/DungeonShooting_Godot/src/framework/map/data/DoorAreaInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/data/DoorAreaInfo.cs @@ -5,7 +5,7 @@ /// /// 用于描述门生成区域 /// -public class DoorAreaInfo +public class DoorAreaInfo : IClone { /// /// 门方向 @@ -68,4 +68,15 @@ break; } } + + public DoorAreaInfo Clone() + { + var data = new DoorAreaInfo(); + data.Start = Start; + data.End = End; + data.Direction = Direction; + return data; + } + + } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/GameConfig.cs b/DungeonShooting_Godot/src/game/GameConfig.cs index 9cb8fec..2eeb673 100644 --- a/DungeonShooting_Godot/src/game/GameConfig.cs +++ b/DungeonShooting_Godot/src/game/GameConfig.cs @@ -26,6 +26,10 @@ /// public const int TileCellSize = 16; /// + /// 游戏地图网格大小, 向量表示 + /// + public static readonly Vector2I TileCellSizeVector2I = new Vector2I(TileCellSize, TileCellSize); + /// /// 房间最小间距 /// public const int RoomSpace = 4; diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs index b7ee115..bdfa6f9 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs @@ -114,7 +114,10 @@ private DungeonRoomSplit _roomSplit; //变动过的数据 + + //地图位置, 单位: 格 private Vector2I _roomPosition; + //地图大小, 单位: 格 private Vector2I _roomSize; private List _doorConfigs = new List(); //------------------------------- @@ -371,9 +374,12 @@ var tileInfo = roomSplit.TileInfo; _roomPosition = roomInfo.Position.AsVector2I(); - _roomSize = roomInfo.Size.AsVector2I(); + SetMapSize(roomInfo.Size.AsVector2I()); _doorConfigs.Clear(); - _doorConfigs.AddRange(roomInfo.DoorAreaInfos); + foreach (var doorAreaInfo in roomInfo.DoorAreaInfos) + { + _doorConfigs.Add(doorAreaInfo.Clone()); + } //初始化层级数据 InitLayer(); @@ -389,8 +395,12 @@ //聚焦 //MapEditorPanel.CallDelay(0.1f, OnClickCenterTool); CallDeferred(nameof(OnClickCenterTool)); - - MapEditorToolsPanel.S_DoorToolTemplate.Instance.SetDoorAreaPosition(_roomPosition * GameConfig.TileCellSize); + + var doorPos = (_roomPosition + new Vector2I(_roomSize.X - 1, 1)) * GameConfig.TileCellSize; + MapEditorToolsPanel.CreateDoorTool( + doorPos, DoorDirection.E, + 0 * GameConfig.TileCellSize, 4 * GameConfig.TileCellSize + ); return true; } @@ -547,7 +557,7 @@ { var rect = GetUsedRect(); _roomPosition = rect.Position; - _roomSize = rect.Size; + SetMapSize(rect.Size); } //检测是否有不合规的图块, 返回true表示图块正常 @@ -732,6 +742,11 @@ } } + public void Create_N_DoorArea() + { + + } + //保存房间配置 private void SaveRoomInfoConfig() { @@ -786,4 +801,14 @@ Position = pos; MapEditorToolsPanel.SetDoorToolTransform(pos, Scale); } + + //设置地图大小 + private void SetMapSize(Vector2I size) + { + if (_roomSize != size) + { + _roomSize = size; + MapEditorToolsPanel.SetDoorHoverToolTransform(_roomPosition, _roomSize); + } + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs index daa9955..d393db6 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragArea.cs @@ -5,7 +5,7 @@ public partial class DoorDragArea : Control { /// - /// 当前区域所占大小 + /// 当前区域所占大小, 单位: 像素 /// public Vector2 AreaSize => new Vector2(_areaSize, GameConfig.TileCellSize * 2); @@ -23,21 +23,15 @@ //默认颜色 private Color _defaultColor; //区域大小, 单位: 像素 - private int _areaSize; + private int _areaSize = GameConfig.TileCellSize * 4; //拖拽松手后是否可以提交 private bool _canComment = true; //开始拖拽时的区域 private Vector2I _startDragRange; - //原始缩放 - private Vector2 _originScale; - //原始坐标 - private Vector2 _originPosition; public void SetDoorDragAreaNode(MapEditorTools.DoorToolTemplate node) { _node = node; - _originScale = Scale; - _originPosition = Position; _defaultColor = _node.L_DoorArea.Instance.Color; _node.L_StartBtn.Instance.DragEvent += OnStartAreaDrag; _node.L_EndBtn.Instance.DragEvent += OnEndAreaDrag; @@ -47,11 +41,11 @@ } /// - /// 设置门区域的位置 + /// 设置门区域的位置, 单位: 像素 /// public void SetDoorAreaPosition(Vector2 position) { - _originPosition = position; + Position = position; } /// @@ -62,66 +56,55 @@ Direction = direction; if (direction == DoorDirection.N) { - _originScale = new Vector2(1, 1); + Scale = new Vector2(1, 1); RotationDegrees = 0; } else if (direction == DoorDirection.E) { - _originScale = new Vector2(1, 1); + Scale = new Vector2(1, 1); RotationDegrees = 90; } else if (direction == DoorDirection.S) { - _originScale = new Vector2(-1, 1); + Scale = new Vector2(-1, 1); RotationDegrees = 180; } else { - _originScale = new Vector2(-1, 1); + Scale = new Vector2(-1, 1); RotationDegrees = 270; } } - - /// - /// 设置位置和缩放, 用于跟随地图 - /// - public void SetDoorAreaTransform(Vector2 pos, Vector2 scale) - { - Position = _originPosition * scale + pos; - Scale = _originScale * scale; - } - + /// /// 获取门区域所占范围, 单位: 像素, 返回的 Vector2I 的 x 代表起始坐标, y 代表结束坐标 /// /// public Vector2I GetDoorAreaRange() { - return new Vector2I((int)_node.L_StartBtn.Instance.Position.X, _areaSize); + return new Vector2I((int)(_node.L_StartBtn.Instance.Position.X + _node.L_StartBtn.Instance.Size.X), _areaSize); } /// - /// 设置门区域所占范围, + /// 设置门区域所占范围, 单位: 像素 /// public void SetDoorAreaRange(int start, int size) { var startPosition = _node.L_StartBtn.Instance.Position; - startPosition.X = start; + startPosition.X = start - _node.L_StartBtn.Instance.Size.X; _node.L_StartBtn.Instance.Position = startPosition; SetDoorAreaSize(size); } - + /// - /// 设置区域大小 + /// 设置区域大小, 单位: 像素 /// public void SetDoorAreaSize(int value) { - if (_areaSize != value) - { - _areaSize = value; - RefreshArea(); - } + _areaSize = value; + RefreshArea(); + GD.Print("size: " + GetDoorAreaRange()); } //刷新区域位置 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs index a3aa53c..3a54a10 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs @@ -6,6 +6,7 @@ public partial class DoorDragButton : TextureButton { private static Vector2 _stepValue = new Vector2(GameConfig.TileCellSize, GameConfig.TileCellSize); + /// /// 拖拽当前物体的回调函数, 第一个参数为拖拽状态, 第二个参数为相对于初始点的拖拽偏移坐标 @@ -16,6 +17,7 @@ private bool _down; private Vector2 _startPos; private Vector2 _prevPos; + private MapEditorToolsPanel _mapEditorToolsPanel; public override void _Ready() { @@ -24,13 +26,19 @@ ButtonUp += OnButtonUp; } + public void SetMapEditorToolsPanel(MapEditorToolsPanel panel) + { + _mapEditorToolsPanel = panel; + } + public override void _Process(double delta) { if (_down) { if (DragEvent != null) { - var offset = Utils.Adsorption((GetGlobalMousePosition() - _startPos) / _parent.Scale, _stepValue); + var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_DoorToolRoot.Instance.Scale; + var offset = Utils.Adsorption(value, _stepValue); //处理朝向问题 if (_parent.Direction == DoorDirection.E) { @@ -72,7 +80,8 @@ Modulate = new Color(1, 1, 1, 1); if (DragEvent != null) { - var offset = Utils.Adsorption((GetGlobalMousePosition() - _startPos) / _parent.Scale, _stepValue); + var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_DoorToolRoot.Instance.Scale; + var offset = Utils.Adsorption(value, _stepValue); _prevPos = offset; DragEvent(DragState.DragEnd, offset); } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs new file mode 100644 index 0000000..c2c017c --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorHoverArea.cs @@ -0,0 +1,83 @@ +using Godot; +using UI.MapEditorTools; + +public partial class DoorHoverArea : ColorRect +{ + /// + /// 所属 Ui 对象 + /// + public MapEditorToolsPanel MapEditorToolsPanel { get; private set; } + + /// + /// 房间门的朝向 + /// + public DoorDirection Direction { get; private set; } + + private bool _mouseHover; + private bool _isDrag; + private Control _parent; + + private MapEditorTools.DoorToolTemplate _dragArea; + private MapEditorTools.HoverPrevRoot _cloneRoot; + + public override void _Ready() + { + _parent = GetParent(); + MouseEntered += OnMouseEnter; + MouseExited += OnMouseExit; + } + + public void Init(MapEditorToolsPanel panel, DoorDirection direction) + { + MapEditorToolsPanel = panel; + Direction = direction; + } + + public override void _Process(double delta) + { + + if (_mouseHover && MapEditorToolsPanel.ActiveHoverArea == this) + { + var globalPosition = _parent.GlobalPosition; + var start = Utils.Adsorption(_parent.GetLocalMousePosition().X, GameConfig.TileCellSize); + //MapEditorToolsPanel.S_HoverPrevRoot.Instance.Visible = true; + //MapEditorToolsPanel.S_HoverPrevRoot.Instance.GlobalPosition = new Vector2(); + + if (!_isDrag) + { + if (Input.IsMouseButtonPressed(MouseButton.Left)) + { + _isDrag = true; + _dragArea = MapEditorToolsPanel.CreateDoorTool(globalPosition, Direction, start, 4 * GameConfig.TileCellSize); + } + } + else + { + if (!Input.IsMouseButtonPressed(MouseButton.Left)) + { + _isDrag = false; + MapEditorToolsPanel.RemoveDoorTool(_dragArea); + _dragArea = null; + } + } + } + } + + private void OnMouseEnter() + { + if (MapEditorToolsPanel.ActiveHoverArea == null || !MapEditorToolsPanel.ActiveHoverArea._isDrag) + { + _mouseHover = true; + MapEditorToolsPanel.SetActiveHoverArea(this); + } + } + + private void OnMouseExit() + { + if (MapEditorToolsPanel.ActiveHoverArea == null || !MapEditorToolsPanel.ActiveHoverArea._isDrag) + { + _mouseHover = false; + MapEditorToolsPanel.S_HoverPrevRoot.Instance.Visible = false; + } + } +} diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs index ce76bfd..8d6ccc4 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs @@ -6,6 +6,19 @@ public abstract partial class MapEditorTools : UiBase { /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot + /// + public DoorToolRoot L_DoorToolRoot + { + get + { + if (_L_DoorToolRoot == null) _L_DoorToolRoot = new DoorToolRoot(this, GetNodeOrNull("DoorToolRoot")); + return _L_DoorToolRoot; + } + } + private DoorToolRoot _L_DoorToolRoot; + + /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.HBoxContainer /// public HBoxContainer L_HBoxContainer @@ -18,19 +31,6 @@ } private HBoxContainer _L_HBoxContainer; - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolTemplate - /// - public DoorToolTemplate L_DoorToolTemplate - { - get - { - if (_L_DoorToolTemplate == null) _L_DoorToolTemplate = new DoorToolTemplate(this, GetNodeOrNull("DoorToolTemplate")); - return _L_DoorToolTemplate; - } - } - private DoorToolTemplate _L_DoorToolTemplate; - public MapEditorTools() : base(nameof(MapEditorTools)) { @@ -41,6 +41,323 @@ } /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.N_HoverRoot.N_HoverArea + /// + public class N_HoverArea : UiNode + { + public N_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public override N_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.N_HoverRoot + /// + public class N_HoverRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.N_HoverArea + /// + public N_HoverArea L_N_HoverArea + { + get + { + if (_L_N_HoverArea == null) _L_N_HoverArea = new N_HoverArea(UiPanel, Instance.GetNodeOrNull("N_HoverArea")); + return _L_N_HoverArea; + } + } + private N_HoverArea _L_N_HoverArea; + + public N_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override N_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.E_HoverRoot.E_HoverArea + /// + public class E_HoverArea : UiNode + { + public E_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public override E_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.E_HoverRoot + /// + public class E_HoverRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.E_HoverArea + /// + public E_HoverArea L_E_HoverArea + { + get + { + if (_L_E_HoverArea == null) _L_E_HoverArea = new E_HoverArea(UiPanel, Instance.GetNodeOrNull("E_HoverArea")); + return _L_E_HoverArea; + } + } + private E_HoverArea _L_E_HoverArea; + + public E_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override E_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.S_HoverRoot.S_HoverArea + /// + public class S_HoverArea : UiNode + { + public S_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public override S_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.S_HoverRoot + /// + public class S_HoverRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.S_HoverArea + /// + public S_HoverArea L_S_HoverArea + { + get + { + if (_L_S_HoverArea == null) _L_S_HoverArea = new S_HoverArea(UiPanel, Instance.GetNodeOrNull("S_HoverArea")); + return _L_S_HoverArea; + } + } + private S_HoverArea _L_S_HoverArea; + + public S_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override S_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.W_HoverRoot.W_HoverArea + /// + public class W_HoverArea : UiNode + { + public W_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public override W_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.W_HoverRoot + /// + public class W_HoverRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.W_HoverArea + /// + public W_HoverArea L_W_HoverArea + { + get + { + if (_L_W_HoverArea == null) _L_W_HoverArea = new W_HoverArea(UiPanel, Instance.GetNodeOrNull("W_HoverArea")); + return _L_W_HoverArea; + } + } + private W_HoverArea _L_W_HoverArea; + + public W_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override W_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.HoverPrevRoot.HoverPrev + /// + public class HoverPrev : UiNode + { + public HoverPrev(MapEditorTools uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public override HoverPrev Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.HoverPrevRoot + /// + public class HoverPrevRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.HoverPrev + /// + public HoverPrev L_HoverPrev + { + get + { + if (_L_HoverPrev == null) _L_HoverPrev = new HoverPrev(UiPanel, Instance.GetNodeOrNull("HoverPrev")); + return _L_HoverPrev; + } + } + private HoverPrev _L_HoverPrev; + + public HoverPrevRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override HoverPrevRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.DoorArea + /// + public class DoorArea : UiNode + { + public DoorArea(MapEditorTools uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public override DoorArea Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.StartBtn + /// + public class StartBtn : UiNode + { + public StartBtn(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } + public override StartBtn Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.EndBtn + /// + public class EndBtn : UiNode + { + public EndBtn(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } + public override EndBtn Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragButton)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate + /// + public class DoorToolTemplate : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorArea + /// + public DoorArea L_DoorArea + { + get + { + if (_L_DoorArea == null) _L_DoorArea = new DoorArea(UiPanel, Instance.GetNodeOrNull("DoorArea")); + return _L_DoorArea; + } + } + private DoorArea _L_DoorArea; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.StartBtn + /// + public StartBtn L_StartBtn + { + get + { + if (_L_StartBtn == null) _L_StartBtn = new StartBtn(UiPanel, Instance.GetNodeOrNull("StartBtn")); + return _L_StartBtn; + } + } + private StartBtn _L_StartBtn; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.EndBtn + /// + public EndBtn L_EndBtn + { + get + { + if (_L_EndBtn == null) _L_EndBtn = new EndBtn(UiPanel, Instance.GetNodeOrNull("EndBtn")); + return _L_EndBtn; + } + } + private EndBtn _L_EndBtn; + + public DoorToolTemplate(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragArea node) : base(uiPanel, node) { } + public override DoorToolTemplate Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragArea)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.DoorToolRoot + /// + public class DoorToolRoot : UiNode + { + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.N_HoverRoot + /// + public N_HoverRoot L_N_HoverRoot + { + get + { + if (_L_N_HoverRoot == null) _L_N_HoverRoot = new N_HoverRoot(UiPanel, Instance.GetNodeOrNull("N_HoverRoot")); + return _L_N_HoverRoot; + } + } + private N_HoverRoot _L_N_HoverRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.E_HoverRoot + /// + public E_HoverRoot L_E_HoverRoot + { + get + { + if (_L_E_HoverRoot == null) _L_E_HoverRoot = new E_HoverRoot(UiPanel, Instance.GetNodeOrNull("E_HoverRoot")); + return _L_E_HoverRoot; + } + } + private E_HoverRoot _L_E_HoverRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.S_HoverRoot + /// + public S_HoverRoot L_S_HoverRoot + { + get + { + if (_L_S_HoverRoot == null) _L_S_HoverRoot = new S_HoverRoot(UiPanel, Instance.GetNodeOrNull("S_HoverRoot")); + return _L_S_HoverRoot; + } + } + private S_HoverRoot _L_S_HoverRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.W_HoverRoot + /// + public W_HoverRoot L_W_HoverRoot + { + get + { + if (_L_W_HoverRoot == null) _L_W_HoverRoot = new W_HoverRoot(UiPanel, Instance.GetNodeOrNull("W_HoverRoot")); + return _L_W_HoverRoot; + } + } + private W_HoverRoot _L_W_HoverRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.HoverPrevRoot + /// + public HoverPrevRoot L_HoverPrevRoot + { + get + { + if (_L_HoverPrevRoot == null) _L_HoverPrevRoot = new HoverPrevRoot(UiPanel, Instance.GetNodeOrNull("HoverPrevRoot")); + return _L_HoverPrevRoot; + } + } + private HoverPrevRoot _L_HoverPrevRoot; + + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolTemplate + /// + public DoorToolTemplate L_DoorToolTemplate + { + get + { + if (_L_DoorToolTemplate == null) _L_DoorToolTemplate = new DoorToolTemplate(UiPanel, Instance.GetNodeOrNull("DoorToolTemplate")); + return _L_DoorToolTemplate; + } + } + private DoorToolTemplate _L_DoorToolTemplate; + + public DoorToolRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override DoorToolRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + } + + /// /// 类型: , 路径: MapEditorTools.HBoxContainer.HandTool /// public class HandTool : UiNode @@ -137,81 +454,81 @@ public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } - /// - /// 类型: , 路径: MapEditorTools.DoorToolTemplate.DoorArea - /// - public class DoorArea : UiNode - { - public DoorArea(MapEditorTools uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } - public override DoorArea Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); - } /// - /// 类型: , 路径: MapEditorTools.DoorToolTemplate.StartBtn + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.N_HoverRoot.N_HoverArea /// - public class StartBtn : UiNode - { - public StartBtn(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } - public override StartBtn Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragButton)Instance.Duplicate()); - } + public N_HoverArea S_N_HoverArea => L_DoorToolRoot.L_N_HoverRoot.L_N_HoverArea; /// - /// 类型: , 路径: MapEditorTools.DoorToolTemplate.EndBtn + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.N_HoverRoot /// - public class EndBtn : UiNode - { - public EndBtn(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } - public override EndBtn Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragButton)Instance.Duplicate()); - } + public N_HoverRoot S_N_HoverRoot => L_DoorToolRoot.L_N_HoverRoot; /// - /// 类型: , 路径: MapEditorTools.DoorToolTemplate + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.E_HoverRoot.E_HoverArea /// - public class DoorToolTemplate : UiNode - { - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorArea - /// - public DoorArea L_DoorArea - { - get - { - if (_L_DoorArea == null) _L_DoorArea = new DoorArea(UiPanel, Instance.GetNodeOrNull("DoorArea")); - return _L_DoorArea; - } - } - private DoorArea _L_DoorArea; + public E_HoverArea S_E_HoverArea => L_DoorToolRoot.L_E_HoverRoot.L_E_HoverArea; - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.StartBtn - /// - public StartBtn L_StartBtn - { - get - { - if (_L_StartBtn == null) _L_StartBtn = new StartBtn(UiPanel, Instance.GetNodeOrNull("StartBtn")); - return _L_StartBtn; - } - } - private StartBtn _L_StartBtn; + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.E_HoverRoot + /// + public E_HoverRoot S_E_HoverRoot => L_DoorToolRoot.L_E_HoverRoot; - /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.EndBtn - /// - public EndBtn L_EndBtn - { - get - { - if (_L_EndBtn == null) _L_EndBtn = new EndBtn(UiPanel, Instance.GetNodeOrNull("EndBtn")); - return _L_EndBtn; - } - } - private EndBtn _L_EndBtn; + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.S_HoverRoot.S_HoverArea + /// + public S_HoverArea S_S_HoverArea => L_DoorToolRoot.L_S_HoverRoot.L_S_HoverArea; - public DoorToolTemplate(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragArea node) : base(uiPanel, node) { } - public override DoorToolTemplate Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragArea)Instance.Duplicate()); - } + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.S_HoverRoot + /// + public S_HoverRoot S_S_HoverRoot => L_DoorToolRoot.L_S_HoverRoot; + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.W_HoverRoot.W_HoverArea + /// + public W_HoverArea S_W_HoverArea => L_DoorToolRoot.L_W_HoverRoot.L_W_HoverArea; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.W_HoverRoot + /// + public W_HoverRoot S_W_HoverRoot => L_DoorToolRoot.L_W_HoverRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.HoverPrevRoot.HoverPrev + /// + public HoverPrev S_HoverPrev => L_DoorToolRoot.L_HoverPrevRoot.L_HoverPrev; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.HoverPrevRoot + /// + public HoverPrevRoot S_HoverPrevRoot => L_DoorToolRoot.L_HoverPrevRoot; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.DoorArea + /// + public DoorArea S_DoorArea => L_DoorToolRoot.L_DoorToolTemplate.L_DoorArea; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.StartBtn + /// + public StartBtn S_StartBtn => L_DoorToolRoot.L_DoorToolTemplate.L_StartBtn; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.EndBtn + /// + public EndBtn S_EndBtn => L_DoorToolRoot.L_DoorToolTemplate.L_EndBtn; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate + /// + public DoorToolTemplate S_DoorToolTemplate => L_DoorToolRoot.L_DoorToolTemplate; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot + /// + public DoorToolRoot S_DoorToolRoot => L_DoorToolRoot; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.HBoxContainer.HandTool @@ -238,24 +555,4 @@ /// public HBoxContainer S_HBoxContainer => L_HBoxContainer; - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolTemplate.DoorArea - /// - public DoorArea S_DoorArea => L_DoorToolTemplate.L_DoorArea; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolTemplate.StartBtn - /// - public StartBtn S_StartBtn => L_DoorToolTemplate.L_StartBtn; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolTemplate.EndBtn - /// - public EndBtn S_EndBtn => L_DoorToolTemplate.L_EndBtn; - - /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolTemplate - /// - public DoorToolTemplate S_DoorToolTemplate => L_DoorToolTemplate; - } diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs index 366923d..1def4ae 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs @@ -1,12 +1,24 @@ +using System.Collections.Generic; using Godot; namespace UI.MapEditorTools; public partial class MapEditorToolsPanel : MapEditorTools { + /// + /// 鼠标悬停区域 + /// + public DoorHoverArea ActiveHoverArea { get; private set; } + + private List _doorTools = new List(); + public override void OnCreateUi() { - S_DoorToolTemplate.Instance.SetDoorDragAreaNode(S_DoorToolTemplate); + S_N_HoverArea.Instance.Init(this, DoorDirection.N); + S_S_HoverArea.Instance.Init(this, DoorDirection.S); + S_W_HoverArea.Instance.Init(this, DoorDirection.W); + S_E_HoverArea.Instance.Init(this, DoorDirection.E); + S_DoorToolRoot.Instance.RemoveChild(S_DoorToolTemplate.Instance); } public override void OnShowUi() @@ -14,14 +26,88 @@ S_PenTool.Instance.EmitSignal(BaseButton.SignalName.Pressed); } - public override void OnHideUi() + public override void OnDestroyUi() { - + S_DoorToolTemplate.Instance.QueueFree(); } + /// + /// 设置活动的鼠标悬停的区域 + /// + public void SetActiveHoverArea(DoorHoverArea hoverArea) + { + ActiveHoverArea = hoverArea; + // if (hoverArea != null) + // { + // S_HoverPrevRoot.Instance.Reparent(hoverArea.GetParent(), false); + // S_HoverPrevRoot.Instance.Visible = false; + // } + } + + /// + /// 创建门区域设置工具 + /// + /// 原点坐标, 单位: 像素 + /// 方向 + /// 起始位置, 单位: 像素 + /// 区域大小, 单位: 像素 + public DoorToolTemplate CreateDoorTool(Vector2 position, DoorDirection direction, int start, int size) + { + var inst = CreateDoorToolInstance(); + inst.Instance.SetDoorAreaPosition(position); + inst.Instance.SetDoorAreaDirection(direction); + inst.Instance.SetDoorAreaRange(start, size); + return inst; + } + + /// + /// 移除门区域设置工具 + /// + public void RemoveDoorTool(DoorToolTemplate toolInstance) + { + _doorTools.Remove(toolInstance); + toolInstance.Instance.QueueFree(); + } + + /// + /// 设置门区域工具的大小和缩放 + /// + /// 坐标 + /// 缩放 public void SetDoorToolTransform(Vector2 pos, Vector2 scale) { - S_DoorToolTemplate.Instance.SetDoorAreaTransform(pos, scale); + S_DoorToolRoot.Instance.Position = pos; + S_DoorToolRoot.Instance.Scale = scale; } + /// + /// 设置鼠标悬停区域位置和大小 + /// + /// 房间起始点, 单位: 格 + /// 房间大小, 单位: 格 + public void SetDoorHoverToolTransform(Vector2I position, Vector2I size) + { + position *= GameConfig.TileCellSize; + size *= GameConfig.TileCellSize; + S_N_HoverRoot.Instance.Position = position + GameConfig.TileCellSizeVector2I; + S_E_HoverRoot.Instance.Position = new Vector2(position.X + size.X - GameConfig.TileCellSize, position.Y + GameConfig.TileCellSize); + S_S_HoverRoot.Instance.Position = new Vector2(position.X + GameConfig.TileCellSize, position.Y + size.Y - GameConfig.TileCellSize); + S_W_HoverRoot.Instance.Position = position + GameConfig.TileCellSizeVector2I; + + S_N_HoverArea.Instance.Size = new Vector2(size.X - GameConfig.TileCellSize * 2, S_N_HoverArea.Instance.Size.Y); + S_E_HoverArea.Instance.Size = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_E_HoverArea.Instance.Size.Y); + S_S_HoverArea.Instance.Size = new Vector2(size.X - GameConfig.TileCellSize * 2, S_S_HoverArea.Instance.Size.Y); + S_W_HoverArea.Instance.Size = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_W_HoverArea.Instance.Size.Y); + } + + private DoorToolTemplate CreateDoorToolInstance() + { + var doorTool = S_DoorToolTemplate.Clone(); + S_DoorToolRoot.Instance.AddChild(doorTool.Instance); + doorTool.Instance.SetDoorDragAreaNode(doorTool); + doorTool.L_StartBtn.Instance.SetMapEditorToolsPanel(this); + doorTool.L_EndBtn.Instance.SetMapEditorToolsPanel(this); + _doorTools.Add(doorTool); + return doorTool; + } }