测试SKPhysicsBody 是否完全包含其他的任何简单方法?
bodyA
之类的内容包含bodyB
的每个点,或者等等。
只是想在实现一些2D数学助手之前问你,以及附加到给定节点或其他东西的附加“meta”-CGPath。
答案 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}所做的类别提供任何实例方法}}。扩展该类只能通过方法/属性调配来执行,因此这个问题对这个包含类别起了重要作用。