球用新的Sprite套件

Gab*_*iel 5 objective-c ios7 sprite-kit

我想在ios 7上使用新的sprite kit制作一个简单的永远弹跳球.我设置了引力:

 scene.physicsWorld.gravity=CGVectorMake(0, -9);
Run Code Online (Sandbox Code Playgroud)

对于我设置的球体:

ball.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:17];
ball.physicsBody.mass=1;
ball.physicsBody.restitution=1;
ball.physicsBody.linearDamping=0;
ball.physicsBody.angularDamping=0;
Run Code Online (Sandbox Code Playgroud)

这里的球只是SKSpriteNode.但我有一个问题:每次它反弹它的位置会变得有点高一点.几分钟后,球几乎位于屏幕的顶部.谁能帮助解决这个问题.我只想让球每次都弹回到相同的位置(例如屏幕中间).谢谢.

ric*_*ter 15

这里可能有两个问题:

  1. 当球反弹时,两个物体参与碰撞 - 球和它反弹的边缘环.因为在碰撞中没有能量损失,你可能希望两个物体都没有摩擦和恢复.

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

如果你只有一个球上下弹跳,那么速度复位很简单:只需取消速度矢量的垂直分量:

ball.physicsBody.velocity = CGVectorMake(0, -ball.physicsBody.velocity.dy);
Run Code Online (Sandbox Code Playgroud)

如果你从倾斜的表面反弹,它会稍微复杂一些:将速度矢量标准化(即缩放它,使其幅度为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);
Run Code Online (Sandbox Code Playgroud)