5

我正在尝试在 ios 7 上使用新的精灵套件制作一个简单的永远弹跳球。我设置了重力:

 scene.physicsWorld.gravity=CGVectorMake(0, -9);

对于我设置的球体:

ball.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:17];
ball.physicsBody.mass=1;
ball.physicsBody.restitution=1;
ball.physicsBody.linearDamping=0;
ball.physicsBody.angularDamping=0;

Ball 这里只是 SKSpriteNode。但我有一个问题:每次反弹时,它的位置都会变得越来越高。几分钟后,球几乎在屏幕的顶部。任何人都可以帮助解决这个问题。我只是想让球每次都弹回相同的位置(例如屏幕中间)。谢谢。

4

2 回答 2

15

这里可能有两个问题:

  1. 当球反弹时,两个物体参与碰撞 - 球和它反弹的边缘环。为了在碰撞中不损失能量,您可能希望两个物体都具有零摩擦和恢复原状。

  2. 但是,即使你这样做了,许多物理引擎(包括 SpriteKit 的)也会因为浮点舍入错误而在这种情况下遇到麻烦。我发现当我想要一个物体在碰撞后保持恒定速度时,最好强制它——使用didEndContact:didSimulatePhysics处理程序来重置移动物体的速度,使其速度与碰撞前相同(但反方向)。

如果你只是让一个球上下弹跳,那么速度重置很容易:只需否定速度矢量的垂直分量:

ball.physicsBody.velocity = CGVectorMake(0, -ball.physicsBody.velocity.dy);

如果你从一个有角度的表面反弹,它会稍微复杂一些:标准化速度矢量(即缩放它使其大小为 1.0)以获得碰撞后的方向,然后缩放它以使其达到你想要的速度。当我在做这种向量数学时,我喜欢将向量转换为,GLKVector2这样我就可以使用 GLKit 框架中的快速数学函数:

GLKVector2 velocity = GLKVector2Make(ball.physicsBody.velocity.dx, ball.physicsBody.velocity.dy);
GLKVector2 direction = GLKVector2Normalize(velocity);
GLKVector2 newVelocity = GLKVector2MultiplyScalar(direction, newSpeed);
ball.physicsBody.velocity = CGVectorMake(newVelocity.x, newVelocity.y);
于 2013-09-30T17:31:09.350 回答
0

这很奇怪,但如果我设置:

 ball.physicsBody.linearDamping=0.02f;

看起来球并没有改变它的反弹高度。

于 2013-09-29T13:56:51.390 回答