diff --git a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn index 62eb295..e22fa78 100644 --- a/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn +++ b/DungeonShooting_Godot/prefab/ui/MapEditorTools.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://b4u66mxndxbrg"] +[gd_scene load_steps=10 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"] @@ -6,6 +6,8 @@ [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"] [ext_resource type="Texture2D" uid="uid://4wupcp53rrpi" path="res://resource/sprite/ui/mapEditorTools/DoorDragButton.png" id="3_trbb5"] +[ext_resource type="Texture2D" uid="uid://dnty1a2tcawos" path="res://resource/sprite/ui/commonIcon/Mark.png" id="6_n7h3g"] +[ext_resource type="Script" path="res://src/game/ui/mapEditorTools/MarkTool.cs" id="7_ekxcj"] [ext_resource type="Texture2D" uid="uid://cuntr7hec044f" path="res://resource/sprite/ui/commonIcon/Select.png" id="7_mqmd6"] [node name="MapEditorTools" type="Control"] @@ -18,15 +20,15 @@ mouse_filter = 1 script = ExtResource("1_mqp1c") -[node name="DoorToolRoot" type="Control" parent="."] +[node name="ToolRoot" type="Control" parent="."] anchors_preset = 0 offset_right = 40.0 offset_bottom = 40.0 -[node name="N_HoverRoot" type="Control" parent="DoorToolRoot"] +[node name="N_HoverRoot" type="Control" parent="ToolRoot"] anchors_preset = 0 -[node name="N_HoverArea" type="ColorRect" parent="DoorToolRoot/N_HoverRoot"] +[node name="N_HoverArea" type="ColorRect" parent="ToolRoot/N_HoverRoot"] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -37,11 +39,11 @@ color = Color(1, 1, 1, 0) script = ExtResource("2_6qfy3") -[node name="E_HoverRoot" type="Control" parent="DoorToolRoot"] +[node name="E_HoverRoot" type="Control" parent="ToolRoot"] anchors_preset = 0 rotation = 1.5708 -[node name="E_HoverArea" type="ColorRect" parent="DoorToolRoot/E_HoverRoot"] +[node name="E_HoverArea" type="ColorRect" parent="ToolRoot/E_HoverRoot"] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -52,12 +54,12 @@ color = Color(1, 1, 1, 0) script = ExtResource("2_6qfy3") -[node name="S_HoverRoot" type="Control" parent="DoorToolRoot"] +[node name="S_HoverRoot" type="Control" parent="ToolRoot"] anchors_preset = 0 rotation = 3.14159 scale = Vector2(-1, 1) -[node name="S_HoverArea" type="ColorRect" parent="DoorToolRoot/S_HoverRoot"] +[node name="S_HoverArea" type="ColorRect" parent="ToolRoot/S_HoverRoot"] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -69,12 +71,12 @@ color = Color(1, 1, 1, 0) script = ExtResource("2_6qfy3") -[node name="W_HoverRoot" type="Control" parent="DoorToolRoot"] +[node name="W_HoverRoot" type="Control" parent="ToolRoot"] anchors_preset = 0 rotation = 4.71239 scale = Vector2(-1, 1) -[node name="W_HoverArea" type="ColorRect" parent="DoorToolRoot/W_HoverRoot"] +[node name="W_HoverArea" type="ColorRect" parent="ToolRoot/W_HoverRoot"] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -85,12 +87,12 @@ color = Color(1, 1, 1, 0) script = ExtResource("2_6qfy3") -[node name="HoverPreviewRoot" type="Control" parent="DoorToolRoot"] +[node name="HoverPreviewRoot" type="Control" parent="ToolRoot"] visible = false anchors_preset = 0 mouse_filter = 2 -[node name="HoverPreview" type="TextureRect" parent="DoorToolRoot/HoverPreviewRoot"] +[node name="HoverPreview" type="TextureRect" parent="ToolRoot/HoverPreviewRoot"] layout_mode = 1 anchors_preset = 7 anchor_left = 0.5 @@ -105,11 +107,11 @@ mouse_filter = 2 texture = ExtResource("3_trbb5") -[node name="DoorToolTemplate" type="Control" parent="DoorToolRoot"] +[node name="DoorToolTemplate" type="Control" parent="ToolRoot"] anchors_preset = 0 script = ExtResource("3_3w0w6") -[node name="DoorArea" type="ColorRect" parent="DoorToolRoot/DoorToolTemplate"] +[node name="DoorArea" type="ColorRect" parent="ToolRoot/DoorToolTemplate"] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -119,7 +121,7 @@ grow_vertical = 0 color = Color(0.184314, 1, 0.0392157, 0.188235) -[node name="StartBtn" type="TextureButton" parent="DoorToolRoot/DoorToolTemplate"] +[node name="StartBtn" type="TextureButton" parent="ToolRoot/DoorToolTemplate"] layout_mode = 1 anchors_preset = 3 anchor_left = 1.0 @@ -135,7 +137,7 @@ stretch_mode = 0 script = ExtResource("3_45muq") -[node name="EndBtn" type="TextureButton" parent="DoorToolRoot/DoorToolTemplate"] +[node name="EndBtn" type="TextureButton" parent="ToolRoot/DoorToolTemplate"] layout_mode = 1 anchors_preset = 2 anchor_top = 1.0 @@ -148,6 +150,13 @@ stretch_mode = 0 script = ExtResource("3_45muq") +[node name="MarkTemplate" type="TextureRect" parent="ToolRoot"] +layout_mode = 0 +offset_right = 7.0 +offset_bottom = 7.0 +texture = ExtResource("6_n7h3g") +script = ExtResource("7_ekxcj") + [node name="HBoxContainer" type="HBoxContainer" parent="."] layout_mode = 1 anchors_preset = 1 diff --git a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Room1/Room1_preinstall.json b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Room1/Room1_preinstall.json index 983df16..5b48806 100644 --- a/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Room1/Room1_preinstall.json +++ b/DungeonShooting_Godot/resource/map/tileMaps/TestGroup1/battle/Room1/Room1_preinstall.json @@ -1,40 +1 @@ -[ - { - "Name": "test1", - "Weight": 100, - "Remark": "", - "WaveList": [ - [ - { - "Position": { - "X": 0, - "Y": 0 - }, - "Size": { - "X": 0, - "Y": 0 - }, - "DelayTime": 0, - "MarkList": [ - { - "Id": "weapon0006", - "Weight": 100, - "Attr": { - "CurrAmmon": "0", - "ResidueAmmo": "0" - } - }, - { - "Id": "weapon0003", - "Weight": 100, - "Attr": { - "CurrAmmon": "0", - "ResidueAmmo": "0" - } - } - ] - } - ] - ] - } -] \ No newline at end of file +[{"Name":"test1","Weight":100,"Remark":"","WaveList":[[{"Position":{"X":-7,"Y":-7},"Size":{"X":0,"Y":0},"DelayTime":0,"MarkList":[{"Id":"weapon0001","Weight":100,"Attr":{"CurrAmmon":"0","ResidueAmmo":"0"}}]}]]}] \ No newline at end of file diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Mark.png b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Mark.png new file mode 100644 index 0000000..a908b07 --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Mark.png Binary files differ diff --git a/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Mark.png.import b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Mark.png.import new file mode 100644 index 0000000..3670dfb --- /dev/null +++ b/DungeonShooting_Godot/resource/sprite/ui/commonIcon/Mark.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnty1a2tcawos" +path="res://.godot/imported/Mark.png-5890a71756442a021ebbbbe4f9041844.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resource/sprite/ui/commonIcon/Mark.png" +dest_files=["res://.godot/imported/Mark.png-5890a71756442a021ebbbbe4f9041844.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs b/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs index 2866849..bff7847 100644 --- a/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs +++ b/DungeonShooting_Godot/src/framework/generator/UiGenerator.cs @@ -158,6 +158,8 @@ $"\n" + $" public sealed override void OnInitNestedUi()\n" + $" {{\n" + + GenerateUiScriptCode("", uiNodeInfo, retraction) + + $"\n" + GenerateInitNestedUi("", uiNodeInfo, retraction) + $" }}\n" + $"\n" + @@ -167,6 +169,36 @@ $"}}\n"; } + private static string GenerateUiScriptCode(string parent, UiNodeInfo uiNodeInfo, string retraction) + { + var str = ""; + var node = parent + (string.IsNullOrEmpty(parent) ? "" : ".") + uiNodeInfo.Name; + if (uiNodeInfo.IsNodeScript) + { + str += retraction + $" _ = {node};\n"; + } + else + { + if (uiNodeInfo.Children != null) + { + for (var i = 0; i < uiNodeInfo.Children.Count; i++) + { + var item = uiNodeInfo.Children[i]; + if (uiNodeInfo.OriginName == uiNodeInfo.UiRootName) + { + str += GenerateUiScriptCode("", item, retraction); + } + else + { + str += GenerateUiScriptCode(node, item, retraction); + } + } + } + } + + return str; + } + private static string GenerateInitNestedUi(string parent, UiNodeInfo uiNodeInfo, string retraction) { var str = ""; @@ -356,7 +388,7 @@ var script = node.GetScript().As(); if (script == null) //无脚本, 说明是内置节点 { - uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, node.GetType().FullName); + uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, node.GetType().FullName, false); } else //存在脚本 { @@ -365,13 +397,16 @@ var fileName = script.ResourcePath.Substring(index + 1, script.ResourcePath.Length - index - 3 - 1); //在源代码中寻找命名空间 var match = Regex.Match(script.SourceCode, "(?<=namespace\\s+)[\\w\\.]+"); + bool isNodeScript; if (match.Success) //存在命名空间 { - uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, match.Value + "." + fileName); + isNodeScript = IsNodeScript(match.Value + "." + fileName); + uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, match.Value + "." + fileName, isNodeScript); } else //不存在命名空间 { - uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, fileName); + isNodeScript = IsNodeScript(fileName); + uiNode = new UiNodeInfo(uiRootName, fieldName, originName, className, fileName, isNodeScript); } //检测是否是引用Ui if (fileName.EndsWith("Panel")) @@ -412,6 +447,17 @@ return uiNode; } + private static bool IsNodeScript(string typeName) + { + var type = typeof(UiGenerator).Assembly.GetType(typeName); + if (type == null) + { + return false; + } + + return type.IsAssignableTo(typeof(IUiNodeScript)); + } + private class UiNodeInfo { /// @@ -439,17 +485,22 @@ /// public string UiRootName; /// + /// 是否实现了 IUiNodeScript 接口 + /// + public bool IsNodeScript; + /// /// 是否是引用Ui /// public bool IsRefUi; - public UiNodeInfo(string uiRootName, string name, string originName, string className, string nodeTypeName) + public UiNodeInfo(string uiRootName, string name, string originName, string className, string nodeTypeName, bool isNodeScript) { UiRootName = uiRootName; Name = name; OriginName = originName; ClassName = className; NodeTypeName = nodeTypeName; + IsNodeScript = isNodeScript; } } diff --git a/DungeonShooting_Godot/src/framework/ui/IUiNodeScript.cs b/DungeonShooting_Godot/src/framework/ui/IUiNodeScript.cs index 925a3e3..41eb232 100644 --- a/DungeonShooting_Godot/src/framework/ui/IUiNodeScript.cs +++ b/DungeonShooting_Godot/src/framework/ui/IUiNodeScript.cs @@ -1,11 +1,12 @@  /// -/// Ui节点脚本接口, 用于脚本便捷获取所属Ui节点对象 +/// Ui节点脚本接口, 用于脚本便捷获取所属Ui节点对象
+/// 注意: 由于 Godot 编辑器不会自动编译代码, 所以新创建的脚本如果实现该接口请先编译代码 ///
public interface IUiNodeScript { /// - /// 设置所属Ui节点对象 + /// 设置所属Ui节点对象, 该函数会在 _Ready() 之后调用 /// void SetUiNode(IUiNode uiNode); } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs index 69d293c..a636f84 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditor.cs @@ -25,6 +25,7 @@ public sealed override void OnInitNestedUi() { + var inst1 = L_Bg.L_VBoxContainer.L_HSplitContainer.L_Left.L_MarginContainer.L_MapView.L_SubViewport.L_CanvasLayer; RecordNestedUi(inst1.L_MapEditorTools.Instance, inst1, UiManager.RecordType.Open); inst1.L_MapEditorTools.Instance.OnCreateUi(); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs index cb3091c..5e3b5d6 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/MapEditorPanel.cs @@ -1,5 +1,4 @@ using Godot; -using UI.MapEditorTools; namespace UI.MapEditor; diff --git a/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs b/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs index de3e2cb..f0090e4 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditor/TileView/EditorTileMap.cs @@ -933,7 +933,7 @@ private void SetMapPosition(Vector2 pos) { Position = pos; - MapEditorToolsPanel.SetDoorToolTransform(pos, Scale); + MapEditorToolsPanel.SetToolTransform(pos, Scale); } //设置地图大小 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMark.cs b/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMark.cs index 30c52c0..4cafa08 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMark.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorCreateMark/MapEditorCreateMark.cs @@ -51,6 +51,8 @@ public sealed override void OnInitNestedUi() { + _ = L_NumberBar; + } /// diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs index ed1967a..0dd7933 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorMapMark/EditorWaveCell.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using Godot; +using UI.MapEditor; namespace UI.MapEditorMapMark; @@ -49,6 +50,9 @@ var preinstall = CellNode.UiPanel.GetSelectPreinstall(); preinstall.WaveList[Index].Add(markInfo); _grid.Add(markInfo); + //添加标记工具 + var editorPanel = (MapEditorPanel)CellNode.UiPanel.ParentUi; + editorPanel.S_MapEditorTools.Instance.CreateMarkTool(markInfo); } //展开/收起按钮点击 diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs index a648c3f..226a9f5 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/DoorDragButton.cs @@ -38,7 +38,7 @@ { if (DragEvent != null) { - var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_DoorToolRoot.Instance.Scale; + var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_ToolRoot.Instance.Scale; var offset = Utils.Adsorption(value, _stepValue); //处理朝向问题 if (_parent.Direction == DoorDirection.E) @@ -97,7 +97,7 @@ Modulate = new Color(1, 1, 1, 1); if (DragEvent != null) { - var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_DoorToolRoot.Instance.Scale; + var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_ToolRoot.Instance.Scale; var offset = Utils.Adsorption(value, _stepValue); _prevPos = offset; DragEvent(DragState.DragEnd, offset); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs index 9f16ddb..77fc4eb 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorTools.cs @@ -6,17 +6,17 @@ public abstract partial class MapEditorTools : UiBase { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot /// - public DoorToolRoot L_DoorToolRoot + public ToolRoot L_ToolRoot { get { - if (_L_DoorToolRoot == null) _L_DoorToolRoot = new DoorToolRoot(this, GetNodeOrNull("DoorToolRoot")); - return _L_DoorToolRoot; + if (_L_ToolRoot == null) _L_ToolRoot = new ToolRoot((MapEditorToolsPanel)this, GetNodeOrNull("ToolRoot")); + return _L_ToolRoot; } } - private DoorToolRoot _L_DoorToolRoot; + private ToolRoot _L_ToolRoot; /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.HBoxContainer @@ -25,7 +25,7 @@ { get { - if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer(this, GetNodeOrNull("HBoxContainer")); + if (_L_HBoxContainer == null) _L_HBoxContainer = new HBoxContainer((MapEditorToolsPanel)this, GetNodeOrNull("HBoxContainer")); return _L_HBoxContainer; } } @@ -38,24 +38,26 @@ public sealed override void OnInitNestedUi() { + _ = L_ToolRoot.L_MarkTemplate; + } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.N_HoverRoot.N_HoverArea + /// 类型: , 路径: MapEditorTools.ToolRoot.N_HoverRoot.N_HoverArea /// - public class N_HoverArea : UiNode + public class N_HoverArea : UiNode { - public N_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public N_HoverArea(MapEditorToolsPanel uiPanel, DoorHoverArea node) : base(uiPanel, node) { } public override N_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.N_HoverRoot + /// 类型: , 路径: MapEditorTools.ToolRoot.N_HoverRoot /// - public class N_HoverRoot : UiNode + public class N_HoverRoot : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.N_HoverArea + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.N_HoverArea /// public N_HoverArea L_N_HoverArea { @@ -67,26 +69,26 @@ } private N_HoverArea _L_N_HoverArea; - public N_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public N_HoverRoot(MapEditorToolsPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } public override N_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.E_HoverRoot.E_HoverArea + /// 类型: , 路径: MapEditorTools.ToolRoot.E_HoverRoot.E_HoverArea /// - public class E_HoverArea : UiNode + public class E_HoverArea : UiNode { - public E_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public E_HoverArea(MapEditorToolsPanel uiPanel, DoorHoverArea node) : base(uiPanel, node) { } public override E_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.E_HoverRoot + /// 类型: , 路径: MapEditorTools.ToolRoot.E_HoverRoot /// - public class E_HoverRoot : UiNode + public class E_HoverRoot : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.E_HoverArea + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.E_HoverArea /// public E_HoverArea L_E_HoverArea { @@ -98,26 +100,26 @@ } private E_HoverArea _L_E_HoverArea; - public E_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public E_HoverRoot(MapEditorToolsPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } public override E_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.S_HoverRoot.S_HoverArea + /// 类型: , 路径: MapEditorTools.ToolRoot.S_HoverRoot.S_HoverArea /// - public class S_HoverArea : UiNode + public class S_HoverArea : UiNode { - public S_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public S_HoverArea(MapEditorToolsPanel uiPanel, DoorHoverArea node) : base(uiPanel, node) { } public override S_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.S_HoverRoot + /// 类型: , 路径: MapEditorTools.ToolRoot.S_HoverRoot /// - public class S_HoverRoot : UiNode + public class S_HoverRoot : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.S_HoverArea + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.S_HoverArea /// public S_HoverArea L_S_HoverArea { @@ -129,26 +131,26 @@ } private S_HoverArea _L_S_HoverArea; - public S_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public S_HoverRoot(MapEditorToolsPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } public override S_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.W_HoverRoot.W_HoverArea + /// 类型: , 路径: MapEditorTools.ToolRoot.W_HoverRoot.W_HoverArea /// - public class W_HoverArea : UiNode + public class W_HoverArea : UiNode { - public W_HoverArea(MapEditorTools uiPanel, DoorHoverArea node) : base(uiPanel, node) { } + public W_HoverArea(MapEditorToolsPanel uiPanel, DoorHoverArea node) : base(uiPanel, node) { } public override W_HoverArea Clone() => new (UiPanel, (DoorHoverArea)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.W_HoverRoot + /// 类型: , 路径: MapEditorTools.ToolRoot.W_HoverRoot /// - public class W_HoverRoot : UiNode + public class W_HoverRoot : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.W_HoverArea + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.W_HoverArea /// public W_HoverArea L_W_HoverArea { @@ -160,26 +162,26 @@ } private W_HoverArea _L_W_HoverArea; - public W_HoverRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public W_HoverRoot(MapEditorToolsPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } public override W_HoverRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.HoverPreviewRoot.HoverPreview + /// 类型: , 路径: MapEditorTools.ToolRoot.HoverPreviewRoot.HoverPreview /// - public class HoverPreview : UiNode + public class HoverPreview : UiNode { - public HoverPreview(MapEditorTools uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } + public HoverPreview(MapEditorToolsPanel uiPanel, Godot.TextureRect node) : base(uiPanel, node) { } public override HoverPreview Clone() => new (UiPanel, (Godot.TextureRect)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.HoverPreviewRoot + /// 类型: , 路径: MapEditorTools.ToolRoot.HoverPreviewRoot /// - public class HoverPreviewRoot : UiNode + public class HoverPreviewRoot : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.HoverPreview + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.HoverPreview /// public HoverPreview L_HoverPreview { @@ -191,44 +193,44 @@ } private HoverPreview _L_HoverPreview; - public HoverPreviewRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } + public HoverPreviewRoot(MapEditorToolsPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } public override HoverPreviewRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.DoorArea + /// 类型: , 路径: MapEditorTools.ToolRoot.DoorToolTemplate.DoorArea /// - public class DoorArea : UiNode + public class DoorArea : UiNode { - public DoorArea(MapEditorTools uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } + public DoorArea(MapEditorToolsPanel uiPanel, Godot.ColorRect node) : base(uiPanel, node) { } public override DoorArea Clone() => new (UiPanel, (Godot.ColorRect)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.StartBtn + /// 类型: , 路径: MapEditorTools.ToolRoot.DoorToolTemplate.StartBtn /// - public class StartBtn : UiNode + public class StartBtn : UiNode { - public StartBtn(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } + public StartBtn(MapEditorToolsPanel uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } public override StartBtn Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragButton)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.EndBtn + /// 类型: , 路径: MapEditorTools.ToolRoot.DoorToolTemplate.EndBtn /// - public class EndBtn : UiNode + public class EndBtn : UiNode { - public EndBtn(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } + public EndBtn(MapEditorToolsPanel uiPanel, UI.MapEditorTools.DoorDragButton node) : base(uiPanel, node) { } public override EndBtn Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragButton)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot.DoorToolTemplate + /// 类型: , 路径: MapEditorTools.ToolRoot.DoorToolTemplate /// - public class DoorToolTemplate : UiNode + public class DoorToolTemplate : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorArea + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.DoorArea /// public DoorArea L_DoorArea { @@ -241,7 +243,7 @@ private DoorArea _L_DoorArea; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.StartBtn + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.StartBtn /// public StartBtn L_StartBtn { @@ -254,7 +256,7 @@ private StartBtn _L_StartBtn; /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.EndBtn + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolRoot.EndBtn /// public EndBtn L_EndBtn { @@ -266,14 +268,23 @@ } private EndBtn _L_EndBtn; - public DoorToolTemplate(MapEditorTools uiPanel, UI.MapEditorTools.DoorDragArea node) : base(uiPanel, node) { } + public DoorToolTemplate(MapEditorToolsPanel uiPanel, UI.MapEditorTools.DoorDragArea node) : base(uiPanel, node) { } public override DoorToolTemplate Clone() => new (UiPanel, (UI.MapEditorTools.DoorDragArea)Instance.Duplicate()); } /// - /// 类型: , 路径: MapEditorTools.DoorToolRoot + /// 类型: , 路径: MapEditorTools.ToolRoot.MarkTemplate /// - public class DoorToolRoot : UiNode + public class MarkTemplate : UiNode + { + public MarkTemplate(MapEditorToolsPanel uiPanel, UI.MapEditorTools.MarkTool node) : base(uiPanel, node) { } + public override MarkTemplate Clone() => new (UiPanel, (UI.MapEditorTools.MarkTool)Instance.Duplicate()); + } + + /// + /// 类型: , 路径: MapEditorTools.ToolRoot + /// + public class ToolRoot : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.N_HoverRoot @@ -353,23 +364,36 @@ } private DoorToolTemplate _L_DoorToolTemplate; - public DoorToolRoot(MapEditorTools uiPanel, Godot.Control node) : base(uiPanel, node) { } - public override DoorToolRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); + /// + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.MarkTemplate + /// + public MarkTemplate L_MarkTemplate + { + get + { + if (_L_MarkTemplate == null) _L_MarkTemplate = new MarkTemplate(UiPanel, Instance.GetNodeOrNull("MarkTemplate")); + return _L_MarkTemplate; + } + } + private MarkTemplate _L_MarkTemplate; + + public ToolRoot(MapEditorToolsPanel uiPanel, Godot.Control node) : base(uiPanel, node) { } + public override ToolRoot Clone() => new (UiPanel, (Godot.Control)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorTools.HBoxContainer.ToolButton.Select /// - public class Select : UiNode + public class Select : UiNode { - public Select(MapEditorTools uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } + public Select(MapEditorToolsPanel uiPanel, Godot.NinePatchRect node) : base(uiPanel, node) { } public override Select Clone() => new (UiPanel, (Godot.NinePatchRect)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorTools.HBoxContainer.ToolButton /// - public class ToolButton : UiNode + public class ToolButton : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.HBoxContainer.Select @@ -384,14 +408,14 @@ } private Select _L_Select; - public ToolButton(MapEditorTools uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } + public ToolButton(MapEditorToolsPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } public override ToolButton Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); } /// /// 类型: , 路径: MapEditorTools.HBoxContainer /// - public class HBoxContainer : UiNode + public class HBoxContainer : UiNode { /// /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: MapEditorTools.ToolButton @@ -406,85 +430,90 @@ } private ToolButton _L_ToolButton; - public HBoxContainer(MapEditorTools uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } + public HBoxContainer(MapEditorToolsPanel uiPanel, Godot.HBoxContainer node) : base(uiPanel, node) { } public override HBoxContainer Clone() => new (UiPanel, (Godot.HBoxContainer)Instance.Duplicate()); } /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.N_HoverRoot.N_HoverArea + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.N_HoverRoot.N_HoverArea /// - public N_HoverArea S_N_HoverArea => L_DoorToolRoot.L_N_HoverRoot.L_N_HoverArea; + public N_HoverArea S_N_HoverArea => L_ToolRoot.L_N_HoverRoot.L_N_HoverArea; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.N_HoverRoot + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.N_HoverRoot /// - public N_HoverRoot S_N_HoverRoot => L_DoorToolRoot.L_N_HoverRoot; + public N_HoverRoot S_N_HoverRoot => L_ToolRoot.L_N_HoverRoot; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.E_HoverRoot.E_HoverArea + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.E_HoverRoot.E_HoverArea /// - public E_HoverArea S_E_HoverArea => L_DoorToolRoot.L_E_HoverRoot.L_E_HoverArea; + public E_HoverArea S_E_HoverArea => L_ToolRoot.L_E_HoverRoot.L_E_HoverArea; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.E_HoverRoot + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.E_HoverRoot /// - public E_HoverRoot S_E_HoverRoot => L_DoorToolRoot.L_E_HoverRoot; + public E_HoverRoot S_E_HoverRoot => L_ToolRoot.L_E_HoverRoot; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.S_HoverRoot.S_HoverArea + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.S_HoverRoot.S_HoverArea /// - public S_HoverArea S_S_HoverArea => L_DoorToolRoot.L_S_HoverRoot.L_S_HoverArea; + public S_HoverArea S_S_HoverArea => L_ToolRoot.L_S_HoverRoot.L_S_HoverArea; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.S_HoverRoot + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.S_HoverRoot /// - public S_HoverRoot S_S_HoverRoot => L_DoorToolRoot.L_S_HoverRoot; + public S_HoverRoot S_S_HoverRoot => L_ToolRoot.L_S_HoverRoot; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.W_HoverRoot.W_HoverArea + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.W_HoverRoot.W_HoverArea /// - public W_HoverArea S_W_HoverArea => L_DoorToolRoot.L_W_HoverRoot.L_W_HoverArea; + public W_HoverArea S_W_HoverArea => L_ToolRoot.L_W_HoverRoot.L_W_HoverArea; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.W_HoverRoot + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.W_HoverRoot /// - public W_HoverRoot S_W_HoverRoot => L_DoorToolRoot.L_W_HoverRoot; + public W_HoverRoot S_W_HoverRoot => L_ToolRoot.L_W_HoverRoot; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.HoverPreviewRoot.HoverPreview + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.HoverPreviewRoot.HoverPreview /// - public HoverPreview S_HoverPreview => L_DoorToolRoot.L_HoverPreviewRoot.L_HoverPreview; + public HoverPreview S_HoverPreview => L_ToolRoot.L_HoverPreviewRoot.L_HoverPreview; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.HoverPreviewRoot + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.HoverPreviewRoot /// - public HoverPreviewRoot S_HoverPreviewRoot => L_DoorToolRoot.L_HoverPreviewRoot; + public HoverPreviewRoot S_HoverPreviewRoot => L_ToolRoot.L_HoverPreviewRoot; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.DoorArea + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.DoorToolTemplate.DoorArea /// - public DoorArea S_DoorArea => L_DoorToolRoot.L_DoorToolTemplate.L_DoorArea; + public DoorArea S_DoorArea => L_ToolRoot.L_DoorToolTemplate.L_DoorArea; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.StartBtn + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.DoorToolTemplate.StartBtn /// - public StartBtn S_StartBtn => L_DoorToolRoot.L_DoorToolTemplate.L_StartBtn; + public StartBtn S_StartBtn => L_ToolRoot.L_DoorToolTemplate.L_StartBtn; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate.EndBtn + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.DoorToolTemplate.EndBtn /// - public EndBtn S_EndBtn => L_DoorToolRoot.L_DoorToolTemplate.L_EndBtn; + public EndBtn S_EndBtn => L_ToolRoot.L_DoorToolTemplate.L_EndBtn; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot.DoorToolTemplate + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.DoorToolTemplate /// - public DoorToolTemplate S_DoorToolTemplate => L_DoorToolRoot.L_DoorToolTemplate; + public DoorToolTemplate S_DoorToolTemplate => L_ToolRoot.L_DoorToolTemplate; /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.DoorToolRoot + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot.MarkTemplate /// - public DoorToolRoot S_DoorToolRoot => L_DoorToolRoot; + public MarkTemplate S_MarkTemplate => L_ToolRoot.L_MarkTemplate; + + /// + /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.ToolRoot + /// + public ToolRoot S_ToolRoot => L_ToolRoot; /// /// 场景中唯一名称的节点, 节点类型: , 节点路径: MapEditorTools.HBoxContainer.ToolButton.Select diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs index 58b7196..47733ec 100644 --- a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MapEditorToolsPanel.cs @@ -33,6 +33,7 @@ private List _doorTools = new List(); private UiGrid _toolGrid; + private Dictionary _markToolsMap = new Dictionary(); public override void OnCreateUi() { @@ -40,7 +41,8 @@ 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); + S_ToolRoot.Instance.RemoveChild(S_DoorToolTemplate.Instance); + S_MarkTemplate.Instance.Visible = false; _toolGrid = new UiGrid(S_ToolButton, typeof(ToolButtonCell)); _toolGrid.SetColumns(10); @@ -83,14 +85,26 @@ S_HoverPreviewRoot.Instance.Visible = ActiveHoverArea != null && !DoorHoverArea.IsDrag; if (EditorMap.Instance.MouseType == EditorTileMap.MouseButtonType.Door) { - S_DoorToolRoot.Instance.Modulate = new Color(1, 1, 1, 1); + S_ToolRoot.Instance.Modulate = new Color(1, 1, 1, 1); } else { - S_DoorToolRoot.Instance.Modulate = new Color(1, 1, 1, 0.4f); + S_ToolRoot.Instance.Modulate = new Color(1, 1, 1, 0.4f); } } + public void CreateMarkTool(MarkInfo markInfo) + { + var cloneAndPut = S_MarkTemplate.CloneAndPut(); + _markToolsMap.Add(markInfo, cloneAndPut); + cloneAndPut.Instance.Visible = true; + cloneAndPut.Instance.Position = markInfo.Position.AsVector2(); + cloneAndPut.Instance.InitData(markInfo); + } + + /// + /// 获取门区域对象 + /// public DoorHoverArea GetDoorHoverArea(DoorDirection direction) { switch (direction) @@ -103,6 +117,9 @@ return null; } + /// + /// 获取门区域根节点 + /// public Control GetDoorHoverAreaRoot(DoorDirection direction) { switch (direction) @@ -127,7 +144,7 @@ } else { - S_HoverPreviewRoot.Instance.Reparent(S_DoorToolRoot.Instance, false); + S_HoverPreviewRoot.Instance.Reparent(S_ToolRoot.Instance, false); } } @@ -180,14 +197,14 @@ } /// - /// 设置门区域工具的大小和缩放 + /// 设置工具根节点的大小和缩放 /// /// 坐标 /// 缩放 - public void SetDoorToolTransform(Vector2 pos, Vector2 scale) + public void SetToolTransform(Vector2 pos, Vector2 scale) { - S_DoorToolRoot.Instance.Position = pos; - S_DoorToolRoot.Instance.Scale = scale; + S_ToolRoot.Instance.Position = pos; + S_ToolRoot.Instance.Scale = scale; } /// @@ -323,7 +340,7 @@ private DoorToolTemplate CreateDoorToolInstance(DoorHoverArea doorHoverArea) { var doorTool = S_DoorToolTemplate.Clone(); - S_DoorToolRoot.Instance.AddChild(doorTool.Instance); + S_ToolRoot.Instance.AddChild(doorTool.Instance); doorTool.Instance.SetDoorDragAreaNode(doorTool); doorTool.L_StartBtn.Instance.SetMapEditorToolsPanel(this); doorTool.L_EndBtn.Instance.SetMapEditorToolsPanel(this); diff --git a/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs new file mode 100644 index 0000000..0493a70 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/mapEditorTools/MarkTool.cs @@ -0,0 +1,83 @@ +using Godot; + +namespace UI.MapEditorTools; + +/// +/// 标记工具 +/// +public partial class MarkTool : TextureRect, IUiNodeScript +{ + private MapEditorTools.MarkTemplate _toolNode; + private MarkInfo _markInfo; + private bool _enter; + private bool _isMOve; + private Vector2 _offset; + + public void SetUiNode(IUiNode uiNode) + { + _toolNode = (MapEditorTools.MarkTemplate)uiNode; + _toolNode.Instance.MouseEntered += OnMouseEntered; + _toolNode.Instance.MouseExited += OnMouseExited; + } + + public override void _Process(double delta) + { + if (_toolNode != null && _markInfo != null) + { + //鼠标在节点内 + if (_enter) + { + if (_isMOve) + { + if (!Input.IsMouseButtonPressed(MouseButton.Left)) + { + _isMOve = false; + } + } + else if (!_isMOve) + { + if (Input.IsMouseButtonPressed(MouseButton.Left)) + { + _isMOve = true; + _offset = GlobalPosition - GetGlobalMousePosition(); + } + } + } + + //移动中 + if (_isMOve) + { + GlobalPosition = _offset + GetGlobalMousePosition().Round(); + _markInfo.Position = new SerializeVector2(Position.Round()); + } + + //QueueRedraw(); + } + } + + public void InitData(MarkInfo markInfo) + { + _markInfo = markInfo; + } + + private void OnMouseEntered() + { + _enter = true; + } + + private void OnMouseExited() + { + if (!Input.IsMouseButtonPressed(MouseButton.Left)) + { + _enter = false; + } + } + + // public override void _Draw() + // { + // if (_markInfo != null && _markInfo.Size.X != 0 && _markInfo.Size.Y != 0) + // { + // + // } + // } +} \ No newline at end of file