Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorTools / MarkTool.cs
@小李xl 小李xl on 20 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 override void _Process(double delta)
  36. {
  37. if (_toolNode != null && MarkInfo != null && _toolNode.UiPanel.S_ToolRoot.Instance.Visible)
  38. {
  39. if (_isDown)
  40. {
  41. //松开鼠标或者在拖拽区域
  42. if (!Input.IsMouseButtonPressed(MouseButton.Left) || _markAreaToolUp.IsDrag)
  43. {
  44. _isDown = false;
  45. IsDrag = false;
  46. }
  47. }
  48. else if (_enter && !_isDown)
  49. {
  50. //判断是否可以选中
  51. var activeMark = _toolNode.UiPanel.ActiveMark;
  52. if ((activeMark == null || (!activeMark.IsDrag && !activeMark._markAreaToolUp.IsDrag)) &&
  53. !_markAreaToolUp.IsDrag && Input.IsMouseButtonPressed(MouseButton.Left) &&
  54. _toolNode.UiPanel.EditorMap.Instance.MouseType == EditorTileMap.MouseButtonType.Edit)
  55. {
  56. _isDown = true;
  57. if (_toolNode.UiPanel.ActiveMark != this)
  58. {
  59. IsDrag = false;
  60. _toolNode.UiPanel.SetActiveMark(this);
  61. }
  62. else
  63. {
  64. _offset = GlobalPosition - GetGlobalMousePosition();
  65. IsDrag = true;
  66. }
  67. }
  68. }
  69.  
  70. //拖拽中
  71. if (IsDrag && _toolNode.UiPanel.ActiveMark == this)
  72. {
  73. GlobalPosition = _offset + GetGlobalMousePosition().Round();
  74. MarkInfo.Position = new SerializeVector2((Position + (Size / 2).Ceil()).Round());
  75. }
  76.  
  77. //只有选中物体才会显示拖拽区域
  78. if (_toolNode.UiPanel.ActiveMark == this)
  79. {
  80. _markAreaToolUp.Visible = true;
  81. }
  82. else
  83. {
  84. _markAreaToolUp.Visible = false;
  85. }
  86. QueueRedraw();
  87. }
  88. }
  89. /// <summary>
  90. /// 初始化数据
  91. /// </summary>
  92. public void InitData(MarkInfo markInfo)
  93. {
  94. MarkInfo = markInfo;
  95. Position = markInfo.Position.AsVector2() - (Size / 2).Ceil();
  96. _markAreaToolUp.InitData(_toolNode.UiPanel.S_ToolRoot, this);
  97. }
  98. private void OnMouseEntered()
  99. {
  100. _enter = true;
  101. }
  102.  
  103. private void OnMouseExited()
  104. {
  105. _enter = false;
  106. }
  107.  
  108. public override void _Draw()
  109. {
  110. if (MarkInfo != null && !_markAreaToolUp.Visible)
  111. {
  112. var size = new Vector2(MarkInfo.Size.X + 2, MarkInfo.Size.Y + 2);
  113. DrawRect(new Rect2(-size / 2 + Size / 2, size.X, size.Y), new Color(1, 1, 1, 0.7f), false, 1);
  114. }
  115. }
  116.  
  117. /// <summary>
  118. /// 选中标记
  119. /// </summary>
  120. public void OnSelect()
  121. {
  122. var a = Modulate.A;
  123. Modulate = new Color(0, 1, 0, a);
  124. }
  125.  
  126. /// <summary>
  127. /// 取消选中标记
  128. /// </summary>
  129. public void OnUnSelect()
  130. {
  131. var a = Modulate.A;
  132. Modulate = new Color(1, 1, 1, a);
  133. }
  134.  
  135. /// <summary>
  136. /// 设置透明度值
  137. /// </summary>
  138. public void SetModulateAlpha(float a)
  139. {
  140. var m = Modulate;
  141. m.A = a;
  142. Modulate = m;
  143. }
  144. }