0

任何简单的方法来测试 SKPhysicsBody 是否完全包含另一个

类似的东西bodyA包含每个点bodyB,或左右。

只是想在实现一些 2D 数学助手之前问你,通过附加到给定节点或其他东西的附加“元”-CGPaths 来做到这一点。

4

3 回答 3

1

没有直接的方法,但有些方法可能对您有用。如果你的身体是矩形的并且匹配它们节点的框架,这可能值得一试:

BOOL isContained = CGRectContainsRect(bodyA.node.frame, bodyB.node.frame); // bodyA is the container, bodyB is examined for being contained

如果您的身体是由完全任意路径创建的多边形,那么找到它们的包含将是一项复杂的任务。这是一个长镜头,但您可能会使用上述方法结合CGPathGetBoundingBox- 得到一些初始近似值,这将返回多边形周围的矩形,然后您可以检查重叠(CGRectInset根据需要使用)。

还有一个接近的 SKPhysicsWorld 方法:-(SKPhysicsBody *)bodyInRect:(CGRect)rect,但它只返回一个与矩形相交的 SKPhysicsBody。

于 2014-02-19T16:00:28.260 回答
1

我知道这个线程非常古老,但它是 2017 年,我正在寻找答案,最终通过修改我的代码找到了自己的答案。希望这可以帮助某人!它适用于圆形和椭圆形。

-(void)didBeginContact:(SKPhysicsContact *)contact {

// get the path of the physics body ( contact bodyA )
CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(contact.bodyA.node.position.x - contact.bodyA.node.frame.size.width/2, contact.bodyA.node.position.y - contact.bodyA.node.frame.size.height/2, contact.bodyA.node.frame.size.width, contact.bodyA.node.frame.size.height), nil);

// check if that path contains the physics body point of BodyB
if (CGPathContainsPoint(path, NULL, contact.bodyB.node.position, FALSE)) {

    NSLog(@"CONTAINS POINT player body B");

}

}`

于 2017-11-17T04:23:49.353 回答
0

为此做了一个分类。

BOOL putInto = [bodyA containsBody:bodyB];

获取类别SKPhysicsBody+Containment from GitHub,它现在仅适用于路径路径包含,很快也会完成它的圆圈。

解决方案是双重的。

第一部分是CGPath作品。你得到转换状态CGPathRef的表示bodyA,然后遍历 的每个点bodyB,并测试是否包含。这适用于路径路径类型测试,但不适用于圆环,更适用于圆路径。

第二部分是将其包装成一个SKPhysicsBody类别,以封装所有实现细节。这是令人惊讶的痛苦。

当你从类中请求一个SKPhysicsBody实例时SKPhysicsBody,你会期望一个SKPhysicsBody对象作为回报。根据 Apple 的一些设计决定,它会向您吐出一个PKPhysicsBody实例(内部PhysicsKit的一部分),该实例当然不会包含您为SKPhysicsBody. 只能通过方法/属性调配来扩展该类,因此这个问题对这个包含类别很重要。

于 2014-02-20T13:27:35.667 回答