2

在 sprite 中有一个带有三角形图形的项目。我将这些精灵排列在一个网格中,以便它们的矩形都重叠。当精灵被触摸时,它们的 z-order 正在被更改(由我)以将它们放在 zOrder 的顶部。

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

问题是“Is the touch in my rect”方法是基于精灵的矩形,但是图片是三角形,请问有没有人知道一个Cocos友好的方法来测试图片本身是否正在被击中。

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

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

4

3 回答 3

4

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

我最初发布了您可以使用 NSBezierPath,但显然 iPhone 套件上不可用,只能在 Mac 上使用。相反,在 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.

以上是干编码,但应该是正确的。

以上仅适用于我绘制的形状中的三角形(其中 Cx 位于 Ax 和 Bx 之间,A 和 B 处于相同高度,但低于 C)。当然,您可以对其进行修改以针对任何形状进行测试,但是,您必须权衡仅使用可用的CGPath.

如果你不明白,或者它有问题,请告诉我!

于 2009-11-18T19:16:55.327 回答
1

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

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

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

http://www.zwoptexapp.com/

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

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

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

于 2010-10-31T02:08:02.393 回答
0

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

干杯,

马修

于 2009-11-17T15:54:26.627 回答