我已经搜索了这个,我认为必须有一些参数来解决这个问题,但我还没有找到它。
我在SpriteKit中有一个场景,我想要一些圆/球反弹并保持它们无限期的任何速度。它们应该从场景的边缘反弹。
如果它们移动速度足够快,或以相当尖锐的角度击中,这是有效的,但是如果它们变慢并且接近边缘平面,它们会继续移动(这很好)但是它们&# 34;棒"到了边缘。这种坚持是我不想要的。即使走得很慢,它们也应该反弹。
为了设置边缘,我使用了:
SKPhysicsBody *borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
self.physicsBody = borderBody;
self.physicsBody.friction = 0.0;
self.physicsBody.restitution = 1.0;
self.physicsBody.linerDamping = 0.0;
self.physicsBody.angularDamping = 0.0;
self.physicsBody.affectedByGravity = NO;
在圆形节点上,我有类似的设置,例如:
ball.usesPresciseCollisionDetection = YES;
ball.dynamic = YES;
ball.restitution = 1.0;
ball.linearDamping = 0.0;
ball.angularDamping = 0.0;
ball.friction = 0.0;
我的场景中的引力为零。我向节点添加了一个冲动,它们开始弹跳 - 它似乎非常接近,因为事物反弹,但是如果有任何缓慢移动并以较小的角度进入,它们会拥抱"边缘。我将尝试在下面插图以帮助可视化。
http://i.imgur.com/Rpr7luY.png
我尝试过使用大量的PhysicsBody设置,但是不能停止粘贴。
谢谢!
答案 0 :(得分:3)
正如小伙子们提到的那样,this answer可以直观地看作是朝着正确方向迈出的一步,但问题在于整个SpriteKit物理引擎。它是非确定性的,并且在计算中会丢失分数,导致模拟不精确。
简短的回答是改用Box2D。黑客的回答是在相反的方向上施加冲动。
All details are highlighted in my other answer
@Jurik很高兴我可以帮忙:)。
答案 1 :(得分:0)
错误的初始化程序。有两种SKPhysicsBody
- 基于卷和基于边缘的。您正在使用完全错误的类型,而不是参与者的移动。
答案 2 :(得分:0)
问题是多种多样的,并且与物理引擎本身的缺点有关,但是,我设法提出了一种解决方案,不需要任何第三方软件,并且可以产生一致的结果。
在此处查看我的解决方案:Accounting for Low Impact Angles/Velocities that Don't Register as Collisions