From e9b0ce3db253a02a882d10728b16831a5638fd5a Mon Sep 17 00:00:00 2001 From: ww-rm Date: Thu, 2 Oct 2025 11:19:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0None=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=AD=89=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Spine/Interfaces/SpineExtension.cs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/Spine/Interfaces/SpineExtension.cs b/Spine/Interfaces/SpineExtension.cs index e47a96e..46e4c96 100644 --- a/Spine/Interfaces/SpineExtension.cs +++ b/Spine/Interfaces/SpineExtension.cs @@ -12,7 +12,7 @@ namespace Spine.Interfaces /// /// 命中测试等级枚举值 /// - public enum HitTestLevel { Bounds, Meshes, Pixels } + public enum HitTestLevel { None, Bounds, Meshes, Pixels } public static class SpineExtension { @@ -21,7 +21,7 @@ namespace Spine.Interfaces /// /// 命中检测精确度等级 /// - public static HitTestLevel HitTestLevel { get; set; } = HitTestLevel.Bounds; + public static HitTestLevel HitTestLevel { get; set; } /// /// 命中测试时输出命中的插槽名称 @@ -128,12 +128,12 @@ namespace Spine.Interfaces if (self.A <= 0 || !self.Bone.Active || self.Disabled) return false; - if (HitTestLevel == HitTestLevel.Bounds) + if (HitTestLevel == HitTestLevel.None || HitTestLevel == HitTestLevel.Bounds) { self.GetBounds(out var bx, out var by, out var bw, out var bh); return x >= bx && x <= (bx + bw) && y >= by && y <= (by + bh); } - else + else if (HitTestLevel == HitTestLevel.Meshes || HitTestLevel == HitTestLevel.Pixels) { float[] vertices = new float[8]; int[] triangles; @@ -217,6 +217,10 @@ namespace Spine.Interfaces } return false; } + else + { + throw new NotImplementedException(HitTestLevel.ToString()); + } } /// @@ -224,24 +228,29 @@ namespace Spine.Interfaces /// public static bool HitTest(this ISkeleton self, float x, float y) { + if (HitTestLevel == HitTestLevel.None) + { + self.GetBounds(out var bx, out var by, out var bw, out var bh); + return x >= bx && x <= (bx + bw) && y >= by && y <= (by + bh); + } + var cache = new Dictionary(); bool hit = false; - List slotNames = []; + string hitSlotName = ""; foreach (var st in self.IterDrawOrder().Reverse()) { if (st.HitTest(x, y, cache)) { hit = true; - if (!LogHitSlots) - break; - slotNames.Add(st.Name); + hitSlotName = st.Name; + break; } } foreach (var img in cache.Values) img.Dispose(); - if (LogHitSlots && slotNames.Count > 0) + if (hit && LogHitSlots) { - _logger.Debug("Hit ({0}): [{1}]", self.Name, string.Join(", ", slotNames)); + _logger.Debug("Hit ({0}): [{1}]", self.Name, hitSlotName); } return hit; }