一个SpriteKit动态物体如何可能穿过一个静态物体?

4

你好,我在我的SpriteKit游戏中遇到了一个奇怪的效果。

我在屏幕周围建立了一堵墙,使用bodyWithEdgeLoopFromRect创建了一个staticbody

通过设置skView.showsPhysics = YES;,所有物体也在屏幕上显示。

我在屏幕上有一个球,它具有dynamic body。但有时当我给球提供Force时,它竟然穿过静态墙!!!

这怎么可能?

虽然我可以在屏幕上看到两个物体,但动态小球有时会穿过静态墙。

我还为两个physics bodies设置了usesPreciseCollisionDetection = YES;属性,但这并没有解决问题。

我该如何解决这个问题?


如果collisionBitMask没有正确设置或者施加了过多的力,就会发生这种情况。 - 0x141E
我认为collisionBitMask已经正确设置了,如果我没有正确设置它,那么这种情况应该每次都会发生,但只有当我的球(动态物理体)的速度很高时才会发生。 - user4202109
尝试应用脉冲而不是力。此外,作为解决方法,您可以手动检查节点的位置,以防止其超出屏幕范围。 - Epic Byte
1
你可以添加一个SKConstraint来保持你的精灵在屏幕上。在这里查看positionX:Y https://developer.apple.com/library/mac/documentation/SpriteKit/Reference/SKConstraint_Ref/#//apple_ref/occ/clm/SKConstraint/positionX:Y: - 0x141E
我会检查 SKConstraint 相关信息并让你知道。 - user4202109
1个回答

1
当物体的速度非常高时,就会发生这种情况。例如,如果您的球体对象每帧以X + 300的速度移动,那么很有可能它不会检测到“墙”,并且会越过它。
如果速度太高,将usesPreciseCollisionDetection设置为YES也无法解决此问题。
您应该对对象的速度应用速度限制。例如:
```objc if (object.velocity > maxVelocity) { object.velocity = maxVelocity; } ```
if(self.physicsBody.velocity.dx > 100)
    self.physicsBody.velocity = CGVectorMake(100, self.physicsBody.velocity.dy);

上述代码限制了对象向右移动的距离为100,同时保持dy(上下)速度不变。

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