using System.Collections.Generic; using System.Threading.Tasks; using Godot; namespace ColdMint.scripts.utils; /// /// Node Utils /// 节点工具 /// public static class NodeUtils { /// /// Delete all child nodes /// 删除所有子节点 /// /// public static int DeleteAllChild(Node parent) { var deleteNumber = 0; var count = parent.GetChildCount(); if (count <= 0) return deleteNumber; for (var i = 0; i < count; i++) { var node = parent.GetChild(0); parent.RemoveChild(node); node.QueueFree(); deleteNumber++; } return deleteNumber; } /// /// All child nodes are removed asynchronously /// 异步删除所有子节点 /// /// /// public static async Task DeleteAllChildAsync(Node parent) { return await Task.Run(() => DeleteAllChild(parent)); } /// /// Gets the node closest to the origin /// 获取距离原点最近的节点 /// /// ///origin ///原点 /// /// ///Node array ///节点数组 /// /// ///Which nodes are excluded ///排除哪些节点 /// /// ///Whether or not unseen nodes should be excluded ///是否排除不可见的节点 /// /// public static Node2D? GetTheNearestNode(Node2D origin, Node[] array, HashSet? exclude = null, bool excludeInvisibleNodes = true) { var closestDistance = float.MaxValue; Node2D? closestNode = null; foreach (var node in array) { if (node is not Node2D node2D) continue; if (excludeInvisibleNodes && !node2D.Visible) { //If invisible nodes are excluded and the current node is invisible, then the next. //如果排除不可见的节点,且当前节点就是不可见的,那么下一个。 continue; } if (exclude != null && exclude.Contains(node)) { //If the current node, is within our exclusion project. So the next one. //如果当前节点,在我们的排除项目内。那么下一个。 continue; } var distance = node2D.GlobalPosition.DistanceTo(origin.GlobalPosition); if (distance < closestDistance) { closestDistance = distance; closestNode = node2D; } } return closestNode; } }