SKPhysicsBody遏制测试?

时间:2014-02-19 14:14:29

标签: ios sprite-kit skphysicsbody

测试SKPhysicsBody 是否完全包含其他的任何简单方法?

bodyA之类的内容包含bodyB的每个点,或者等等。

只是想在实现一些2D数学助手之前问你,以及附加到给定节点或其他东西的附加“meta”-CGPath。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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");

}

}`

答案 2 :(得分:0)

为此制作了一个类别。

BOOL putInto = [bodyA containsBody:bodyB];

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

解决方案有两个。

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

第二部分是将其包装成 SKPhysicsBody类别,以封装所有实现细节。这令人惊讶地非常有用。

当您从SKPhysicsBody类请求SKPhysicsBody实例时,您会期望获得SKPhysicsBody个对象。根据Apple的一些设计决定,它会向你吐出一个PKPhysicsBody实例(内部PhysicsKit的一部分),这当然不会为你为{{1}所做的类别提供任何实例方法}}。扩展该类只能通过方法/属性调配来执行,因此这个问题对这个包含类别起了重要作用。