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;
}
///
|