using System.Collections.Generic; using System.Linq; using Godot; using Org.BouncyCastle.Crypto.Digests; namespace BITKit; /// /// 为Godot.Node提供数学工具 /// public static partial class MathNode { public static T Cast(this Node node) where T : Node { return (T)node.GetNode(new NodePath(node.Name)); } /// /// 获取Node下所有的子Node节点 /// /// Root Node /// public static IEnumerable GetAllNode(Node self) { List nodes = new() { self }; For(self); return nodes.Distinct(); void For(Node node) { foreach (var x in node.GetChildren()) { For(x); nodes.Add(x); } } } public static IEnumerable GetNodesInParent(Node self) { var nodes = new List() { self }; var parent = self.GetParent(); while (parent is not null) { nodes.Add(parent); parent = parent.GetParent(); } return nodes.Distinct(); } public static bool TryGetNodeInParent(Node self, out T node) { node = default; var nodes = GetNodesInParent(self); if (nodes.FirstOrDefault(x => x is T) is not T t) return false; node = t; return true; } public static void ClearChild(Node self) { foreach (var x in self.GetChildren()) { x.QueueFree(); } } public static T Create(this Node self) where T : Node,new() { var t = new T(); self.AddChild(t); return t; } }