SpriteKit - physicsBody不尊重边缘

4
我有一个物体,它的物理体是从一个路径创建出来的。 整个场景区域(= 整个屏幕)本身就是这个物体不能逃脱的边界。 这个场景的边界是由下面这些定义的:
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

几乎一切正常。物体在边缘上碰撞并反弹,并大部分时间受到它们的限制,但如果您多次坚持,高冲量地向边缘发射物体,那么物体最终将不尊重边缘并逃脱,这可能是另一个SpriteKit的bug。

物体的类初始化如下:

self.physicsBody.dynamic = YES;

CGFloat offsetX = self.frame.size.width/2.0f;
CGFloat offsetY = self.frame.size.height/2.0f;

CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, 60 - offsetX, 79 - offsetY);
CGPathAddLineToPoint(path, NULL, 96 - offsetX, 69 - offsetY);
CGPathAddLineToPoint(path, NULL, 124 - offsetX, 44 - offsetY);
CGPathAddLineToPoint(path, NULL, 120 - offsetX, 23 - offsetY);
CGPathAddLineToPoint(path, NULL, 85 - offsetX, 0 - offsetY);
CGPathAddLineToPoint(path, NULL, 62 - offsetX, 3 - offsetY);
CGPathAddLineToPoint(path, NULL, 37 - offsetX, 19 - offsetY);
CGPathAddLineToPoint(path, NULL, 12 - offsetX, 29 - offsetY);
CGPathAddLineToPoint(path, NULL, 3 - offsetX, 39 - offsetY);
CGPathAddLineToPoint(path, NULL, 7 - offsetX, 58 - offsetY);
CGPathAddLineToPoint(path, NULL, 27 - offsetX, 46 - offsetY);
CGPathAddLineToPoint(path, NULL, 36 - offsetX, 61 - offsetY);

CGPathCloseSubpath(path);

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
self.physicsBody.restitution = 0.0f;
self.physicsBody.usesPreciseCollisionDetection = YES;

我该采取哪些措施来检测并防止对象离开屏幕?

谢谢。


你能解决这个问题吗?我遇到了类似的问题,圆形物体与边缘发生碰撞后,经过一些尝试施加力量,物体逃离了边缘,再也无法回到屏幕上...不确定这是否真的是SpriteKit的错误。 - Khanh
是的,但那并不适用于我的情况。我有一个圆形物理体,问题仍然存在... - Khanh
@Khanh SpriteKit真是个烂摊子。六个月前,我直接向苹果提交了大约15份关于SpriteKit的错误报告,但苹果根本不在乎解决这个问题。那其他物体的碰撞形状呢? - Duck
是的,同意这个观点。我只有两个基于多边形的形状,我确信已经遵循了指南。最后,我有一个小补丁来检查它是否到达了边缘,然后取消速度... - Khanh
如果圆形给你带来了问题,尝试创建一个类似圆形的形状,看看会发生什么。 - Duck
那是一个非常明智的建议。我会尝试测试它。谢谢。 - Khanh
1个回答

5
我没有追踪这些点,但看起来你要么有一个非凸多边形,要么顶点不按逆时针方向排列,或者两者都有。确保该形状是凸的,并且顶点顺序(绕组)按逆时针顺序排列。
如果此形状仅用于碰撞检测的静态(非移动)体,则可以使用bodyWithEdgeLoopbodyWithEdgeChain,其中绕组和凸形状无关紧要。
PS:不要忘记释放路径:
CGPathRelease(path);

bodyWithEdgeLoopbodyWithEdgeChain有什么区别? - Duck
我用另外两个函数替换了bodyWithPolygonFromPath,但物体停止移动了。重力或力对其没有任何影响。 - Duck
就像我之前说的,如果身体是静态的(不移动,不受重力或接触影响),您可以使用边缘/链方法,否则您必须确保多边形已正确设置以便与bodyWithPolygonFromPath一起使用。 - CodeSmile
你是对的!!!!!!问题就是形状不是凸的!!谢谢。 - Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接