Objective c 带着新雪碧套装的球
我正在尝试用ios 7上的新精灵套件制作一个简单的永远弹跳的球。 我设定重力: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;
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;
球的弹跳高度似乎没有改变。这里可能有两个问题:
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。