Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / common / Utils.cs
@小李xl 小李xl on 16 Jul 2023 3 KB 完整的加载与保存逻辑
  1. using System.Linq;
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 常用函数工具类
  6. /// </summary>
  7. public static class Utils
  8. {
  9. /// <summary>
  10. /// 默认随机数对象
  11. /// </summary>
  12. public static SeedRandom Random { get; }
  13. static Utils()
  14. {
  15. Random = new SeedRandom();
  16. GD.Print("随机种子为: ", Random.Seed);
  17. }
  18.  
  19. /// <summary>
  20. /// 根据四个点计算出矩形
  21. /// </summary>
  22. public static Rect2 CalcRect(float start1, float end1, float start2, float end2)
  23. {
  24. return new Rect2(
  25. Mathf.Min(start1, start2), Mathf.Min(end1, end2),
  26. Mathf.Abs(start1 - start2), Mathf.Abs(end1 - end2)
  27. );
  28. }
  29. /// <summary>
  30. /// 返回碰撞层 mask 是否会检测 layer
  31. /// </summary>
  32. public static bool CollisionMaskWithLayer(uint mask, uint layer)
  33. {
  34. return (mask & layer) != 0;
  35. }
  36.  
  37. /// <summary>
  38. /// 使用定的 canvasItem 绘制导航区域, 注意, 该函数只能在 draw 函数中调用
  39. /// </summary>
  40. public static void DrawNavigationPolygon(CanvasItem canvasItem, NavigationPolygonData[] polygonData, int width = 1)
  41. {
  42. for (var i = 0; i < polygonData.Length; i++)
  43. {
  44. var item = polygonData[i];
  45. var points = item.GetPoints();
  46. if (points.Length>= 2)
  47. {
  48. var array = new Vector2[points.Length + 1];
  49. for (var j = 0; j < points.Length; j++)
  50. {
  51. array[j] = points[j];
  52. }
  53.  
  54. array[array.Length - 1] = points[0];
  55. if (item.Type == NavigationPolygonType.In)
  56. {
  57. canvasItem.DrawPolyline(array, Colors.Yellow, width);
  58. }
  59. else
  60. {
  61. canvasItem.DrawPolyline(array, Colors.Red, width);
  62. }
  63. }
  64. }
  65. }
  66. /// <summary>
  67. /// 将一个任意角度转为0到360度
  68. /// </summary>
  69. public static float ConvertAngle(float angle)
  70. {
  71. angle %= 360; // 取余
  72.  
  73. if (angle < 0) // 如果角度为负数,转为正数
  74. {
  75. angle += 360;
  76. }
  77.  
  78. return angle;
  79. }
  80.  
  81. /// <summary>
  82. /// 字符串首字母小写
  83. /// </summary>
  84. public static string FirstToLower(this string str)
  85. {
  86. return str.Substring(0, 1).ToLower() + str.Substring(1);
  87. }
  88. /// <summary>
  89. /// 字符串首字母大写
  90. /// </summary>
  91. public static string FirstToUpper(this string str)
  92. {
  93. return str.Substring(0, 1).ToUpper() + str.Substring(1);
  94. }
  95.  
  96. /// <summary>
  97. /// 将 Vector2 类型转为 Vector2I 类型
  98. /// </summary>
  99. public static Vector2I AsVector2I(this Vector2 vector2)
  100. {
  101. return new Vector2I((int)vector2.X, (int)vector2.Y);
  102. }
  103.  
  104. /// <summary>
  105. /// 返回指定坐标是否在UI节范围点内
  106. /// </summary>
  107. public static bool IsPositionOver(this Control control, Vector2 position)
  108. {
  109. var rect = control.GetRect();
  110. return position.X >= rect.Position.X && position.X <= rect.End.X &&
  111. position.Y >= rect.Position.Y && position.Y <= rect.End.Y;
  112. }
  113. }