增加None命中测试等级
This commit is contained in:
@@ -12,7 +12,7 @@ namespace Spine.Interfaces
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 命中测试等级枚举值
|
/// 命中测试等级枚举值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum HitTestLevel { Bounds, Meshes, Pixels }
|
public enum HitTestLevel { None, Bounds, Meshes, Pixels }
|
||||||
|
|
||||||
public static class SpineExtension
|
public static class SpineExtension
|
||||||
{
|
{
|
||||||
@@ -21,7 +21,7 @@ namespace Spine.Interfaces
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 命中检测精确度等级
|
/// 命中检测精确度等级
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static HitTestLevel HitTestLevel { get; set; } = HitTestLevel.Bounds;
|
public static HitTestLevel HitTestLevel { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 命中测试时输出命中的插槽名称
|
/// 命中测试时输出命中的插槽名称
|
||||||
@@ -128,12 +128,12 @@ namespace Spine.Interfaces
|
|||||||
if (self.A <= 0 || !self.Bone.Active || self.Disabled)
|
if (self.A <= 0 || !self.Bone.Active || self.Disabled)
|
||||||
return false;
|
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);
|
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);
|
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];
|
float[] vertices = new float[8];
|
||||||
int[] triangles;
|
int[] triangles;
|
||||||
@@ -217,6 +217,10 @@ namespace Spine.Interfaces
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new NotImplementedException(HitTestLevel.ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -224,24 +228,29 @@ namespace Spine.Interfaces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static bool HitTest(this ISkeleton self, float x, float y)
|
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<SFML.Graphics.Texture, SFML.Graphics.Image>();
|
var cache = new Dictionary<SFML.Graphics.Texture, SFML.Graphics.Image>();
|
||||||
bool hit = false;
|
bool hit = false;
|
||||||
List<string> slotNames = [];
|
string hitSlotName = "";
|
||||||
foreach (var st in self.IterDrawOrder().Reverse())
|
foreach (var st in self.IterDrawOrder().Reverse())
|
||||||
{
|
{
|
||||||
if (st.HitTest(x, y, cache))
|
if (st.HitTest(x, y, cache))
|
||||||
{
|
{
|
||||||
hit = true;
|
hit = true;
|
||||||
if (!LogHitSlots)
|
hitSlotName = st.Name;
|
||||||
break;
|
break;
|
||||||
slotNames.Add(st.Name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (var img in cache.Values) img.Dispose();
|
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;
|
return hit;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user