Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorTools / DoorHoverArea.cs
@小李xl 小李xl on 6 Jan 2024 4 KB 保存TileSet数据,开发中
  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. Debug.Log("提交创建: " + direction + ", " + start + ", " + end);
  74. _currToolTemplate.Instance.DoorAreaInfo = MapEditorToolsPanel.EditorMap.Instance.CreateDoorArea(direction, start, end);
  75. //派发修改数据修改事件
  76. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  77. }
  78.  
  79. //取消提交
  80. private void OnCancelDoorArea()
  81. {
  82. IsDrag = false;
  83. _currToolTemplate = null;
  84. }
  85.  
  86. private void OnMouseEnter()
  87. {
  88. if (MapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Edit)
  89. {
  90. return;
  91. }
  92. if (MapEditorToolsPanel.ActiveHoverArea == null || !IsDrag)
  93. {
  94. var roomSize = MapEditorToolsPanel.EditorMap.Instance.CurrRoomSize;
  95. //房间大小为0, 不能放置门区域
  96. if (roomSize.X == 0 && roomSize.Y == 0)
  97. {
  98. return;
  99. }
  100. //正在拖拽标记, 不能放置门区域
  101. var activeMark = MapEditorToolsPanel.ActiveMark;
  102. if (activeMark != null && (activeMark.IsDrag || activeMark.MarkAreaTool.IsDrag))
  103. {
  104. return;
  105. }
  106. _mouseHover = true;
  107. MapEditorToolsPanel.SetActiveHoverArea(this);
  108. }
  109. }
  110. private void OnMouseExit()
  111. {
  112. if (MapEditorToolsPanel.EditorMap.Instance.MouseType != EditorTileMap.MouseButtonType.Edit)
  113. {
  114. return;
  115. }
  116. if (MapEditorToolsPanel.ActiveHoverArea == null || !IsDrag)
  117. {
  118. _mouseHover = false;
  119. if (MapEditorToolsPanel.ActiveHoverArea == this)
  120. {
  121. MapEditorToolsPanel.SetActiveHoverArea(null);
  122. }
  123. }
  124. }
  125. }