diff --git a/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn b/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn index 598c689..69d5e89 100644 --- a/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn +++ b/DungeonShooting_Godot/prefab/ui/TileSetEditorTerrain.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=9 format=3 uid="uid://dfqb73y4br8yd"] +[gd_scene load_steps=10 format=3 uid="uid://dfqb73y4br8yd"] [ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs" id="1_6jjk7"] [ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/left/TileEditArea.cs" id="2_ynf0r"] [ext_resource type="Script" path="res://src/game/common/ui/EditorMaskBrush.cs" id="3_gydh0"] +[ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/left/TerrainCellDragHandler.cs" id="3_ssd86"] [ext_resource type="Script" path="res://src/game/ui/tileSetEditorTerrain/right/TileEditTerrain.cs" id="5_0x7yx"] [ext_resource type="Texture2D" uid="uid://d2wslibovwv7w" path="res://resource/sprite/ui/commonIcon/CenterTool.png" id="5_08bc4"] [ext_resource type="Texture2D" uid="uid://18dira1me63t" path="res://resource/sprite/map/PreviewMap.png" id="5_m0oxr"] @@ -74,6 +75,7 @@ offset_right = 16.0 offset_bottom = 16.0 mouse_filter = 1 +script = ExtResource("3_ssd86") [node name="MaskBrush" type="Control" parent="HSplitContainer/LeftBottom/MarginContainer/LeftBg/TileTexture"] layout_mode = 1 diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs index c05951f..9ed217a 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrain.cs @@ -32,12 +32,12 @@ } /// - /// 类型: , 路径: TileSetEditorTerrain.HSplitContainer.LeftBottom.MarginContainer.LeftBg.TileTexture.CellRoot.Cell + /// 类型: , 路径: TileSetEditorTerrain.HSplitContainer.LeftBottom.MarginContainer.LeftBg.TileTexture.CellRoot.Cell /// - public class Cell : UiNode + public class Cell : UiNode { - public Cell(TileSetEditorTerrainPanel uiPanel, Godot.TextureButton node) : base(uiPanel, node) { } - public override Cell Clone() => new (UiPanel, (Godot.TextureButton)Instance.Duplicate()); + public Cell(TileSetEditorTerrainPanel uiPanel, UI.TileSetEditorTerrain.TerrainCellDragHandler node) : base(uiPanel, node) { } + public override Cell Clone() => new (UiPanel, (UI.TileSetEditorTerrain.TerrainCellDragHandler)Instance.Duplicate()); } /// @@ -46,13 +46,13 @@ public class CellRoot : UiNode { /// - /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.HSplitContainer.LeftBottom.MarginContainer.LeftBg.TileTexture.Cell + /// 使用 Instance 属性获取当前节点实例对象, 节点类型: , 节点路径: TileSetEditorTerrain.HSplitContainer.LeftBottom.MarginContainer.LeftBg.TileTexture.Cell /// public Cell L_Cell { get { - if (_L_Cell == null) _L_Cell = new Cell(UiPanel, Instance.GetNode("Cell")); + if (_L_Cell == null) _L_Cell = new Cell(UiPanel, Instance.GetNode("Cell")); return _L_Cell; } } @@ -416,7 +416,7 @@ /// - /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.HSplitContainer.LeftBottom.MarginContainer.LeftBg.TileTexture.CellRoot.Cell + /// 场景中唯一名称的节点, 节点类型: , 节点路径: TileSetEditorTerrain.HSplitContainer.LeftBottom.MarginContainer.LeftBg.TileTexture.CellRoot.Cell /// public Cell S_Cell => L_HSplitContainer.L_LeftBottom.L_MarginContainer.L_LeftBg.L_TileTexture.L_CellRoot.L_Cell; diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs index fe453a5..90a3d7c 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/TileSetEditorTerrainPanel.cs @@ -9,6 +9,11 @@ /// 父Ui /// public TileSetEditorPanel EditorPanel; + + /// + /// 是否正在拖拽图块 + /// + public bool IsDraggingCell { get; set; } private UiGrid _grid; @@ -42,11 +47,11 @@ } var cellVertical = EditorPanel.CellVertical; _grid.SetColumns(cellHorizontal); - for (var i = 0; i < cellVertical; i++) + for (var y = 0; y < cellVertical; y++) { - for (var j = 0; j < cellHorizontal; j++) + for (var x = 0; x < cellHorizontal; x++) { - _grid.Add(default); + _grid.Add(new Rect2I(x * GameConfig.TileCellSize, y * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize)); } } } diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/MaskCell.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/MaskCell.cs index dd2cc04..cf22503 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/MaskCell.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/MaskCell.cs @@ -6,10 +6,16 @@ { public override void OnInit() { - CellNode.Instance.Draw += OnDraw; + CellNode.Instance.DragOutline = false; + CellNode.Instance.InitTexture(CellNode.UiPanel.S_LeftBg.L_TileTexture.Instance); CellNode.Instance.AddDragListener(OnDrag); } + public override void OnSetData(Rect2I data) + { + CellNode.Instance.SetRect(data); + } + public override void Process(float delta) { CellNode.Instance.QueueRedraw(); @@ -19,20 +25,23 @@ { if (state == DragState.DragStart) { + CellNode.UiPanel.IsDraggingCell = true; Grid.SelectIndex = Index; + Debug.Log($"data: {Data}"); } - Debug.Log($"state: {state}, delta: {delta}"); - } - - private void OnDraw() - { - if (Grid.SelectIndex == Index) + else if (state == DragState.DragEnd) { - //选中时绘制轮廓 - CellNode.Instance.DrawRect( - new Rect2(Vector2.Zero, CellNode.Instance.Size), - new Color(0, 1, 1), false, 2f / CellNode.UiPanel.S_LeftBg.L_TileTexture.Instance.Scale.X - ); + CellNode.UiPanel.IsDraggingCell = false; } } + + public override void OnSelect() + { + CellNode.Instance.DragOutline = true; + } + + public override void OnUnSelect() + { + CellNode.Instance.DragOutline = false; + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/TerrainCellDragHandler.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/TerrainCellDragHandler.cs new file mode 100644 index 0000000..266dd52 --- /dev/null +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/left/TerrainCellDragHandler.cs @@ -0,0 +1,60 @@ +using Godot; + +namespace UI.TileSetEditorTerrain; + +public partial class TerrainCellDragHandler : TextureButton +{ + /// + /// 是否绘制轮廓 + /// + public bool DragOutline { get; set; } = false; + + private TextureRect _textureRect; + private Texture2D _texture; + private Rect2I _rect2I; + + public void InitTexture(TextureRect textureRect) + { + _textureRect = textureRect; + _texture = textureRect.Texture; + } + + public void SetRect(Rect2I rect) + { + _rect2I = rect; + } + + public override void _Process(double delta) + { + if (DragOutline) + { + QueueRedraw(); + } + } + + public override Variant _GetDragData(Vector2 atPosition) + { + var sprite = new Sprite2D(); + sprite.Texture = _texture; + sprite.RegionEnabled = true; + sprite.RegionRect = _rect2I; + var control = new Control(); + control.AddChild(sprite); + control.ZIndex = 10; + control.Scale = _textureRect.Scale; + SetDragPreview(control); + return ""; + } + + public override void _Draw() + { + if (DragOutline) + { + //选中时绘制轮廓 + DrawRect( + new Rect2(Vector2.Zero, Size), + new Color(0, 1, 1), false, 2f / _textureRect.Scale.X + ); + } + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/right/TileEditTerrain.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/right/TileEditTerrain.cs index d7d1a52..d069044 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/right/TileEditTerrain.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/right/TileEditTerrain.cs @@ -16,9 +16,9 @@ public override void _Process(double delta) { - var isMouseInRect = UiNode.L_TileTexture.Instance.IsMouseInRect(); - UiNode.L_Grid.Instance.Visible = isMouseInRect; - UiNode.L_TileTexture.L_Brush.Instance.Visible = isMouseInRect; + var flag = UiNode.UiPanel.IsDraggingCell; + UiNode.L_Grid.Instance.Visible = flag; + UiNode.L_TileTexture.L_Brush.Instance.Visible = flag; } ///