gpt4 book ai didi

objective-c - 带有新 SpriteKit 的球

转载 作者:太空狗 更新时间:2023-10-30 03:47:34 25 4
gpt4 key购买 nike

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

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

最佳答案

这里可能有两个问题:

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

  2. 即使您这样做了,许多物理引擎(包括 SpriteKit 的)也会因为 floating point rounding errors 而遇到这种情况。 .我发现当我想让一个物体在碰撞后保持恒定速度时,最好强制它 -- 使用 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);

关于objective-c - 带有新 SpriteKit 的球,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19070122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com