using System; using Godot; using UI.MapEditor; namespace UI.MapEditorTools; public partial class DoorDragButton : TextureButton { private static Vector2 _stepValue = new Vector2(GameConfig.TileCellSize, GameConfig.TileCellSize); /// <summary> /// 拖拽当前物体的回调函数, 第一个参数为拖拽状态, 第二个参数为相对于初始点的拖拽偏移坐标 /// </summary> public event Action<DragState, Vector2> DragEvent; private DoorDragArea _parent; private bool _down; private Vector2 _startPos; private Vector2 _prevPos; private MapEditorToolsPanel _mapEditorToolsPanel; public override void _Ready() { _parent = GetParent<DoorDragArea>(); ButtonDown += OnButtonDown; ButtonUp += OnButtonUp; } public void SetMapEditorToolsPanel(MapEditorToolsPanel panel) { _mapEditorToolsPanel = panel; } public override void _Process(double delta) { if (_down) { if (DragEvent != null) { var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_ToolRoot.Instance.Scale; var offset = Utils.Adsorption(value, _stepValue); //处理朝向问题 if (_parent.Direction == DoorDirection.E) { offset = new Vector2(offset.Y, offset.X); } else if (_parent.Direction == DoorDirection.S) { offset = new Vector2(-offset.X, offset.Y); } else if (_parent.Direction == DoorDirection.W) { offset = new Vector2(offset.Y, -offset.X); } if (offset != _prevPos) { _prevPos = offset; DragEvent(DragState.DragMove, offset); } } } } private void OnButtonDown() { if (_mapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Edit) { return; } if (_down) { return; } _down = true; Modulate = new Color(0.7f, 0.7f, 0.7f, 1); _startPos = GetGlobalMousePosition(); _prevPos = new Vector2(-99999, -99999); if (DragEvent != null) { DragEvent(DragState.DragStart, Vector2.Zero); } } private void OnButtonUp() { if (_mapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Edit) { return; } if (!_down) { return; } _down = false; Modulate = new Color(1, 1, 1, 1); if (DragEvent != null) { var value = (GetGlobalMousePosition() - _startPos) / _parent.Scale / _mapEditorToolsPanel.S_ToolRoot.Instance.Scale; var offset = Utils.Adsorption(value, _stepValue); _prevPos = offset; DragEvent(DragState.DragEnd, offset); } } }