using Godot; namespace UI.TileSetEditorTerrain; public partial class TileEditArea : EditorGridBg { public new TileSetEditorTerrain.BottomBg UiNode => (TileSetEditorTerrain.BottomBg)base.UiNode; private bool _dragMoveFlag = false; private MaskCell _hoverCell = null; public override void SetUiNode(IUiNode uiNode) { base.SetUiNode(uiNode); InitNode(UiNode.L_TileTexture.Instance, UiNode.L_Grid.Instance); UiNode.L_TileTexture.L_MaskBrush.Instance.Init(UiNode.L_TileTexture.Instance, UiNode.UiPanel.EditorPanel); UiNode.L_TileTexture.Instance.Texture = UiNode.UiPanel.EditorPanel.Texture; //聚焦按钮点击 UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick; //拖拽Cell UiNode.Instance.AddDragListener(OnDrag); } public override void _Process(double delta) { MaskCell cell = null; var _panel = UiNode.UiPanel; if (!_panel.MaskGrid.IsDestroyed && _panel.S_BottomBg.Instance.IsMouseInRect() && _panel.S_TileTexture.Instance.IsMouseInRect()) { var cellPosition = Utils.GetMouseCellPosition(_panel.S_TileTexture.Instance); var index = cellPosition.X + cellPosition.Y * _panel.MaskGrid.GetColumns(); var tempCell = (MaskCell)_panel.MaskGrid.GetCell(index); if (tempCell != null && tempCell.ConnectTerrainCell != null) { cell = tempCell; } } SetHoverCell(cell); } /// <summary> /// 设置鼠标悬停Cell /// </summary> public void SetHoverCell(MaskCell cell) { if (cell != _hoverCell) { if (_hoverCell != null) { _hoverCell.Hover = false; } if (cell != null) { cell.Hover = true; } _hoverCell = cell; } } //拖拽操作 private void OnDrag(DragState state, Vector2 delta) { var _panel = UiNode.UiPanel; var sprite = _panel.S_DragSprite.Instance; if (state == DragState.DragStart) //拖拽开始 { //这里要判断一下是否在BottomBg和TileTexture区域内 if (_panel.S_BottomBg.Instance.IsMouseInRect() && _panel.S_TileTexture.Instance.IsMouseInRect()) { var cellPosition = Utils.GetMouseCellPosition(_panel.S_TileTexture.Instance); var index = cellPosition.X + cellPosition.Y * _panel.MaskGrid.GetColumns(); var cell = (MaskCell)_panel.MaskGrid.GetCell(index); if (cell != null && !cell.UseFlag) //必须要没有使用的Cell { _panel.DraggingCell = cell; _panel.MaskGrid.SelectIndex = index; _dragMoveFlag = false; } } } else if (state == DragState.DragEnd) //拖拽结束 { if (_panel.DraggingCell != null) { if (_panel.S_TopBg.Instance.IsMouseInRect()) //找到放置的Cell { _panel.OnDropCell(_panel.DraggingCell); } sprite.Visible = false; _dragMoveFlag = false; _panel.DraggingCell = null; } } else if (_panel.DraggingCell != null) //拖拽移动 { if (!_dragMoveFlag) { _dragMoveFlag = true; sprite.Texture = _panel.S_TileTexture.Instance.Texture; sprite.RegionRect = _panel.DraggingCell.Data; sprite.Scale = _panel.S_TopBg.L_TerrainRoot.Instance.Scale; sprite.Visible = true; sprite.GlobalPosition = sprite.GetGlobalMousePosition(); } sprite.GlobalPosition = sprite.GetGlobalMousePosition(); } } /// <summary> /// 改变TileSet纹理 /// </summary> public void OnChangeTileSetTexture() { UiNode.L_TileTexture.Instance.Size = UiNode.L_TileTexture.Instance.Texture.GetSize(); OnFocusClick(); } //聚焦按钮点击 private void OnFocusClick() { var texture = UiNode.L_TileTexture.Instance.Texture; Utils.DoFocusNode(ContainerRoot, Size, texture != null ? texture.GetSize() : Vector2.Zero); RefreshGridTrans(); } }