Objective c 带着新雪碧套装的球

Objective c 带着新雪碧套装的球,objective-c,ios7,sprite-kit,Objective C,Ios7,Sprite Kit,我正在尝试用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;

我正在尝试用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.physicsBody.linearDamping=0.02f;

球的弹跳高度似乎没有改变。

这里可能有两个问题:

  • 当球反弹时,碰撞涉及两个物体——球和它反弹的边环。为了在碰撞中不损失能量,你可能希望两个物体都没有摩擦和恢复

  • 即使你这么做了,许多物理引擎(包括SpriteKit)也会因为这个原因遇到类似的问题。我发现,当我想要一个物体在碰撞后保持恒定的速度时,最好强迫它——使用或操纵器重置移动物体的速度,使其与碰撞前的速度相同(但方向相反)

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

    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);
    

    试着用向量(0,9)代替(0,-9),告诉我发生了什么同样的问题,但球现在从屏幕顶部反弹(就像如果地面在顶部),这就是我认为会发生的。你是说每次反弹,球都会反弹得更高?没错。但我想让它反弹到同样的高度。比如无限反弹。你有其他物体吗?如果有,它们的摩擦力和恢复值是什么?你对球施加了任何力或改变了速度吗?如果你跑了很长时间,看看它是否会减速。任何线性阻尼都可能导致它减速。我知道,但它不会失去“能量”,我已经等了很长时间,大约30-40分钟。谢谢!现在我也认为很多物理引擎都有同样的问题,因为浮点舍入错误,就像你提到的。所以我第一次尝试在didSimulatePhysics方法中对球进行限制,例如,如果球的y位置高于305,我将它改为300,但我认为这不是正确的方法。所以我决定按照你的建议,在碰撞后将球的速度设置为负值,但与之前的值相同,并且有效。事实上,对我来说,将球上的恢复设置为1,将桨上的恢复设置为0。