有没有更准确的方法来查看两个精灵是否相交?

时间:2014-01-29 03:30:39

标签: objective-c sprite sprite-kit cgrect skscene

CGRect rect4 = CGRectMake(rock.position.x, rock.position.y, rock.size.width, rock.size.height);
CGRect bulletRect = CGRectMake(bullet.position.x, bullet.position.y, bullet.size.width, bullet.size.height);
if (CGRectIntersectsRect(bulletRect, rect4)) {
    NSLog(@"hit Bullet");
    //[bullet removeFromParent];
}

似乎“击中子弹”即使矩阵4不在子弹附近。 谢谢

1 个答案:

答案 0 :(得分:0)

我不确切地知道你的形状是怎样的,但我的猜测是它们只是用矩形象征性的。

- 首先检查你的x和y摇滚和子弹位置是否真的是它们的左上角坐标,如果没有考虑你的边界矩形的平移。

- 要提高边界形状的精度,不要太复杂,可以使用位于对象矩形较小的边界上的点云。然后,您将使用CGRectContainsPoint检查形状是否相交。您应该将您的点放在多边形边界的最突出部分。你可以将它们的坐标相对于rock.position.x和y坐标。

例如:你知道你的摇滚乐的x和y。您可以使用以下内容来定位一个点:p1 = x + dx,y + dy。

enter image description here

请注意,在没有交叉点的情况下,典型的边界框方法会将其视为交叉点。

所以,在代码中:

CGPoint p1 = CGPointMake(rock.position.x+dx, rock.position.y+dy);
CGRect bulletRect = CGRectMake(bullet.position.x, bullet.position.y, bullet.size.width, bullet.size.height);
if (CGRectContainsPoint(bulletRect, p1)) {
    NSLog(@"hit Bullet");
}

当然,你拥有的点越多,它就越精确。如果你有一个真实的话,只需循环一个点数组和break

另一个更加复杂和准确的选择可能是图形引擎,例如Box2D

希望它有所帮助。

˚F


修改


Dx和Dy是您已知点(rock.position.x,rock.position.y)与测试点(此处为p1)之间的差异。

dx and dy