有一个在精灵中包含三角形图形的项目。我将这些精灵排列在网格中,以便它们的矩形全部重叠。当精灵被触摸时,它们的 z 顺序(由我)被更改,以将它们放在 zOrder 的顶部。
我使用的是 Cocos 0.8.1 和触摸调度程序方法。我可以进行触摸操作,但显然与其他精灵重叠的“隐藏”精灵无法被触摸。
问题是“Is the touch in my rect”方法是基于精灵的矩形,但图像是三角形,我想问是否有人知道一个Cocos友好的方法来测试图像本身是否正在被击中。
我似乎记得这是当时流行的命中测试方法,但我找不到任何关于如何在 Cocos/iPhone Land 中完成它的参考。
目标是仅在触摸图像像素时响应触摸,而不仅仅是包含精灵的矩形。
当然,您可以根据您想要的任何形状进行测试,而不是针对盒子进行测试。
我最初发布过你可以使用 NSBezierPath,但显然这在 iPhone 套件上不可用,只能在 Mac 上使用。相反,在 iPhone 上您可以使用 CGPath。
使用以下命令创建新路径CGPathCreateMutable()
它返回一个const CGPath *
(也称为CHPathRef
然后使用CGPathAddRect
or CGPathAddLines
创造我们的道路。
CGPathContainsPoint
将测试您的点是否在形状中。
或者,您可以创建一个客户函数(因为您使用三角形)仅执行简单的计算来检查您的点是否在三角形内部。一些数学知识应该可以解决问题(尽管当你旋转形状时,它会稍微复杂一些。我稍微写了一下,因为你可以相对于形状的原点旋转触摸点并进行点击检测)
对于三角形:
C
/\
/__\
A B
point of touch is P
使用以下算法,您应该能够找到触摸:
/* first test against a box, for performance */
if( P.y > C.y || P.y < A.y || P.x < A.x || P.X > B.x )
return false; // false if P falls outside "the box"
/* then check if its within the shape */
/* split the triangle into 2 parts, around the axle of point C */
if( P.x < C.x ) // if the x value of point P is on the left of point C
if( P.y > ((C.y -A.y) / (C.x - A.x)) * P.x )
return false; // the point is above the triangle's side AC
else // if the x value of point P is greater than or equal to point C
if( P.y > C.y - ((C.y - B.y) / ( B.x - C.x )) * ( P.x - C.x ) )
return false; // the point is above the triangle's side BC
return true; // the point must be in the triangle, so return true.
上面是干编码,但应该是正确的。
以上仅适用于我绘制的形状中的三角形(其中 C.x 位于 A.x 和 B.x 之间,A 和 B 高度相同,但低于 C)。当然,您可以修改它以针对任何形状进行测试,但是,您必须权衡仅使用可用的CGPath
.
如果你不明白,或者有问题,请告诉我!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)