using Godot; using UI.MapEditor; using UI.MapEditorTools; public partial class DoorHoverArea : ColorRect { /// <summary> /// 是否拖拽中 /// </summary> public static bool IsDrag { get; set; } /// <summary> /// 所属 Ui 对象 /// </summary> public MapEditorToolsPanel MapEditorToolsPanel { get; private set; } /// <summary> /// 房间门的朝向 /// </summary> public DoorDirection Direction { get; private set; } private bool _mouseHover; private Control _parent; //当前正在拖拽创建的 DoorToolTemplate private MapEditorTools.DoorToolTemplate _currToolTemplate; public override void _Ready() { _parent = GetParent<Control>(); MouseEntered += OnMouseEnter; MouseExited += OnMouseExit; } public void Init(MapEditorToolsPanel panel, DoorDirection direction) { IsDrag = false; MapEditorToolsPanel = panel; Direction = direction; } public override void _Process(double delta) { if (_mouseHover && MapEditorToolsPanel.ActiveHoverArea == this) { if (!IsDrag) { var start = Utils.Adsorption(_parent.GetLocalMousePosition().X, GameConfig.TileCellSize); var previewRoot = MapEditorToolsPanel.S_HoverPreviewRoot.Instance; //检测是否会与其他门发生碰撞 var canCreateDragArea = MapEditorToolsPanel.EditorMap.Instance.CheckDoorArea(Direction, start, start); if (canCreateDragArea) { previewRoot.Visible = true; previewRoot.Position = new Vector2(start, 0); if (Input.IsMouseButtonPressed(MouseButton.Left)) { IsDrag = true; _currToolTemplate = MapEditorToolsPanel.CreateDragDoorTool(this, start, OnSubmitDoorArea, OnCancelDoorArea); } } else //发生碰撞, 不能提交 { previewRoot.Visible = false; } } } } //提交门区域 private void OnSubmitDoorArea(DoorDirection direction, int start, int end) { IsDrag = false; GD.Print("提交创建: " + direction + ", " + start + ", " + end); _currToolTemplate.Instance.DoorAreaInfo = MapEditorToolsPanel.EditorMap.Instance.CreateDoorArea(direction, start, end); //派发修改数据修改事件 EventManager.EmitEvent(EventEnum.OnEditorDirty); } //取消提交 private void OnCancelDoorArea() { IsDrag = false; _currToolTemplate = null; } private void OnMouseEnter() { if (MapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Edit) { return; } if (MapEditorToolsPanel.ActiveHoverArea == null || !IsDrag) { var roomSize = MapEditorToolsPanel.EditorMap.Instance.CurrRoomSize; //房间大小为0, 不能放置门区域 if (roomSize.X == 0 && roomSize.Y == 0) { return; } //正在拖拽标记, 不能放置门区域 var activeMark = MapEditorToolsPanel.ActiveMark; if (activeMark != null && (activeMark.IsDrag || activeMark.MarkAreaTool.IsDrag)) { return; } _mouseHover = true; MapEditorToolsPanel.SetActiveHoverArea(this); } } private void OnMouseExit() { if (MapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Edit) { return; } if (MapEditorToolsPanel.ActiveHoverArea == null || !IsDrag) { _mouseHover = false; if (MapEditorToolsPanel.ActiveHoverArea == this) { MapEditorToolsPanel.SetActiveHoverArea(null); } } } }