Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorTools / MarkTool.cs
@小李xl 小李xl on 22 Aug 2023 4 KB 完成保存与未保存状态
  1. using Godot;
  2. using UI.MapEditor;
  3.  
  4. namespace UI.MapEditorTools;
  5.  
  6. /// <summary>
  7. /// 标记工具
  8. /// </summary>
  9. public partial class MarkTool : TextureRect, IUiNodeScript
  10. {
  11. /// <summary>
  12. /// 绑定的数据
  13. /// </summary>
  14. public MarkInfo MarkInfo { get; private set; }
  15. /// <summary>
  16. /// 是否拖拽中
  17. /// </summary>
  18. public bool IsDrag { get; private set; }
  19. private bool _enter;
  20. private MapEditorTools.MarkTemplate _toolNode;
  21. private bool _isDown;
  22. private Vector2 _offset;
  23. private MarkAreaTool _markAreaToolUp;
  24. public void SetUiNode(IUiNode uiNode)
  25. {
  26. _toolNode = (MapEditorTools.MarkTemplate)uiNode;
  27. _toolNode.Instance.MouseEntered += OnMouseEntered;
  28. _toolNode.Instance.MouseExited += OnMouseExited;
  29. _markAreaToolUp = new MarkAreaTool();
  30. _markAreaToolUp.Position = Size / 2;
  31. _markAreaToolUp.Visible = false;
  32. AddChild(_markAreaToolUp);
  33. }
  34.  
  35. public void OnDestroy()
  36. {
  37. }
  38.  
  39. public override void _Process(double delta)
  40. {
  41. if (_toolNode != null && MarkInfo != null && _toolNode.UiPanel.S_ToolRoot.Instance.Visible)
  42. {
  43. if (_isDown)
  44. {
  45. //松开鼠标或者在拖拽区域
  46. if (!Input.IsMouseButtonPressed(MouseButton.Left) || _markAreaToolUp.IsDrag)
  47. {
  48. _isDown = false;
  49. IsDrag = false;
  50. }
  51. }
  52. else if (_enter && !_isDown)
  53. {
  54. //判断是否可以选中
  55. var activeMark = _toolNode.UiPanel.ActiveMark;
  56. if ((activeMark == null || (!activeMark.IsDrag && !activeMark._markAreaToolUp.IsDrag)) &&
  57. !_markAreaToolUp.IsDrag && Input.IsMouseButtonPressed(MouseButton.Left) &&
  58. _toolNode.UiPanel.EditorMap.Instance.MouseType == EditorTileMap.MouseButtonType.Edit)
  59. {
  60. _isDown = true;
  61. if (_toolNode.UiPanel.ActiveMark != this)
  62. {
  63. IsDrag = false;
  64. _toolNode.UiPanel.SetActiveMark(this);
  65. }
  66. else
  67. {
  68. _offset = GlobalPosition - GetGlobalMousePosition();
  69. IsDrag = true;
  70. }
  71. }
  72. }
  73.  
  74. //拖拽中
  75. if (IsDrag && _toolNode.UiPanel.ActiveMark == this)
  76. {
  77. GlobalPosition = _offset + GetGlobalMousePosition().Round();
  78. MarkInfo.Position = new SerializeVector2((Position + (Size / 2).Ceil()).Round());
  79. }
  80.  
  81. //只有选中物体才会显示拖拽区域
  82. if (_toolNode.UiPanel.ActiveMark == this)
  83. {
  84. _markAreaToolUp.Visible = true;
  85. }
  86. else
  87. {
  88. _markAreaToolUp.Visible = false;
  89. }
  90. QueueRedraw();
  91. }
  92. }
  93. /// <summary>
  94. /// 初始化数据
  95. /// </summary>
  96. public void InitData(MarkInfo markInfo)
  97. {
  98. MarkInfo = markInfo;
  99. Position = markInfo.Position.AsVector2() - (Size / 2).Ceil();
  100. _markAreaToolUp.InitData(_toolNode.UiPanel.S_ToolRoot, this);
  101. }
  102. private void OnMouseEntered()
  103. {
  104. _enter = true;
  105. }
  106.  
  107. private void OnMouseExited()
  108. {
  109. _enter = false;
  110. }
  111.  
  112. public override void _Draw()
  113. {
  114. if (MarkInfo != null && !_markAreaToolUp.Visible)
  115. {
  116. var size = new Vector2(MarkInfo.Size.X + 2, MarkInfo.Size.Y + 2);
  117. DrawRect(new Rect2(-size / 2 + Size / 2, size.X, size.Y), new Color(1, 1, 1, 0.7f), false, 1);
  118. }
  119. }
  120.  
  121. /// <summary>
  122. /// 选中标记
  123. /// </summary>
  124. public void OnSelect()
  125. {
  126. var a = Modulate.A;
  127. Modulate = new Color(0, 1, 0, a);
  128. }
  129.  
  130. /// <summary>
  131. /// 取消选中标记
  132. /// </summary>
  133. public void OnUnSelect()
  134. {
  135. var a = Modulate.A;
  136. Modulate = new Color(1, 1, 1, a);
  137. }
  138.  
  139. /// <summary>
  140. /// 设置透明度值
  141. /// </summary>
  142. public void SetModulateAlpha(float a)
  143. {
  144. var m = Modulate;
  145. m.A = a;
  146. Modulate = m;
  147. }
  148. }