Cocos2d iPhone非矩形雪碧触摸检测

时间:2009-09-25 15:15:46

标签: iphone cocos2d-iphone touch detection

在精灵中有一个带有三角形图形的项目。我在网格中安排这些精灵,使它们的矩形都重叠。当精灵被触摸时,他们的z顺序正被改变(由我)将它们放在zOrder的顶部。

我正在使用Cocos 0.8.1和触摸调度程序方法。我接触过工作,但显然与其他精灵重叠的“隐藏”精灵无法触及。

问题在于“我的矩形触摸”方法是基于精灵的矩形,但图像是一个三角形,我想问一下是否有人知道一种Cocos友好的测试方法是否图像本身正在被击中。

我似乎记得这是当天流行的热门测试方法,但我找不到任何关于它如何在Cocos / iPhone Land中完成的参考。

目标是仅在触摸图像像素时响应触摸,而不仅仅是包含精灵的矩形。

3 个答案:

答案 0 :(得分:4)

而不是对盒子进行测试,你当然可以测试你想要的任何形状。

我最初发布的你可以使用NSBezierPath,但很明显,只有在Mac上才能在iPhone套件上使用。相反,在iPhone上你可以使用CGPath。

使用CGPathCreateMutable()创建新路径,该路径返回const CGPath *(也称为CHPathRef
然后使用CGPathAddRectCGPathAddLines创建我们的路径 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来衡量它。

如果你没有得到它,或者它有问题,请告诉我!

答案 1 :(得分:1)

我找到了这个很棒的教程,解释了如何使用两个精彩且不可或缺的实用程序以及Cocos2d和Box2d来检测碰撞(你也可以类似地使用Chipmunk)。您可以使用它们设置程序以检测触摸,就像检测到碰撞一样。

http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

这是Zwoptexapp的链接 - 帮助您为精灵/ spritesheet设置plist文件。

http://www.zwoptexapp.com/

以下是VertexHelper的链接 - 允许您跟踪精灵的轮廓,然后将轮廓转换为可以粘贴到项目中的代码,并与Box2d,Chipmunk等一起使用。

http://www.springenwerk.com/2010/02/introducing-vertexhelper-for-box2d.html

我自己还在学习Cocos2d和Box2d,Ray的教程对我非常有帮助。我希望他们也帮助你!

答案 2 :(得分:0)

我见过几种平铺编辑器工具,包括Cocos2D开发人员提供的工具,它允许您使用贝塞尔曲线,以便直接勾勒出与矩形相对应的精确图像。当使用Box2D Physics时,根据我在Cocos2D网站和youtube上看到的视频教程和示例,这看起来非常简单。它将在youtube上显示Google Tile或Map Editor和Cocos2d,它们可以显示一些您可以使用的工具,并且不需要编写任何复杂的几何碰撞 - 应该是WYSIWYG。

干杯,

马修