Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorTools / DoorHoverArea.cs
@小李xl 小李xl on 30 Jul 2023 3 KB 编辑门区域动态调整大小
  1. using Godot;
  2. using UI.MapEditor;
  3. using UI.MapEditorTools;
  4.  
  5. public partial class DoorHoverArea : ColorRect
  6. {
  7. /// <summary>
  8. /// 是否拖拽中
  9. /// </summary>
  10. public static bool IsDrag { get; set; }
  11. /// <summary>
  12. /// 所属 Ui 对象
  13. /// </summary>
  14. public MapEditorToolsPanel MapEditorToolsPanel { get; private set; }
  15.  
  16. /// <summary>
  17. /// 房间门的朝向
  18. /// </summary>
  19. public DoorDirection Direction { get; private set; }
  20. private bool _mouseHover;
  21. private Control _parent;
  22. //当前正在拖拽创建的 DoorToolTemplate
  23. private MapEditorTools.DoorToolTemplate _currToolTemplate;
  24. public override void _Ready()
  25. {
  26. _parent = GetParent<Control>();
  27. MouseEntered += OnMouseEnter;
  28. MouseExited += OnMouseExit;
  29. }
  30.  
  31. public void Init(MapEditorToolsPanel panel, DoorDirection direction)
  32. {
  33. IsDrag = false;
  34. MapEditorToolsPanel = panel;
  35. Direction = direction;
  36. }
  37.  
  38. public override void _Process(double delta)
  39. {
  40. if (_mouseHover && MapEditorToolsPanel.ActiveHoverArea == this)
  41. {
  42. if (!IsDrag)
  43. {
  44. var start = Utils.Adsorption(_parent.GetLocalMousePosition().X, GameConfig.TileCellSize);
  45. var previewRoot = MapEditorToolsPanel.S_HoverPreviewRoot.Instance;
  46.  
  47. //检测是否会与其他门发生碰撞
  48. var canCreateDragArea = MapEditorToolsPanel.EditorMap.Instance.CheckDoorArea(Direction, start, start);
  49. if (canCreateDragArea)
  50. {
  51. previewRoot.Visible = true;
  52. previewRoot.Position = new Vector2(start, 0);
  53.  
  54. if (Input.IsMouseButtonPressed(MouseButton.Left))
  55. {
  56. IsDrag = true;
  57. _currToolTemplate = MapEditorToolsPanel.CreateDragDoorTool(this, start,
  58. OnSubmitDoorArea, OnCancelDoorArea);
  59. }
  60. }
  61. else //发生碰撞, 不能提交
  62. {
  63. previewRoot.Visible = false;
  64. }
  65. }
  66. }
  67. }
  68.  
  69. //提交门区域
  70. private void OnSubmitDoorArea(DoorDirection direction, int start, int end)
  71. {
  72. IsDrag = false;
  73. GD.Print("提交区域: " + direction + ", " + start + ", " + end);
  74. _currToolTemplate.Instance.DoorAreaInfo = MapEditorToolsPanel.EditorMap.Instance.CreateDoorArea(direction, start, end);
  75. }
  76.  
  77. //取消提交
  78. private void OnCancelDoorArea()
  79. {
  80. IsDrag = false;
  81. _currToolTemplate = null;
  82. }
  83.  
  84. private void OnMouseEnter()
  85. {
  86. if (MapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Door)
  87. {
  88. return;
  89. }
  90. if (MapEditorToolsPanel.ActiveHoverArea == null || !IsDrag)
  91. {
  92. _mouseHover = true;
  93. MapEditorToolsPanel.SetActiveHoverArea(this);
  94. }
  95. }
  96. private void OnMouseExit()
  97. {
  98. if (MapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Door)
  99. {
  100. return;
  101. }
  102. if (MapEditorToolsPanel.ActiveHoverArea == null || !IsDrag)
  103. {
  104. _mouseHover = false;
  105. if (MapEditorToolsPanel.ActiveHoverArea == this)
  106. {
  107. MapEditorToolsPanel.SetActiveHoverArea(null);
  108. }
  109. }
  110. }
  111. }