SKSpriteKit在碰撞后保持恒速

我正在尝试使我的第一个iOS应用程序,目前遇到问题。

在我的比赛中,当球弹跳时,我希望它能以相同的速度弹回到相同的高度。 目前这样做很好。 但是,当我旋转六angular形,它打一个angular度,它结束了速度,并没有反弹到同一高度。

所以我的问题是:如何在碰撞时强制球保持相同的速度?

这是我的球节点的代码:

func createBallNode(ballColor: String) -> SKSpriteNode { let ball = SKSpriteNode(imageNamed: ballColor) ball.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)+30) ball.zPosition = 1 ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2) ball.physicsBody?.affectedByGravity = true ball.physicsBody?.restitution = 1 ball.physicsBody?.linearDamping = 0 ball.physicsBody?.friction = 0 ball.physicsBody?.categoryBitMask = ColliderType.Ball.rawValue ball.physicsBody?.contactTestBitMask = ColliderType.Rect.rawValue ball.physicsBody?.collisionBitMask = ColliderType.Rect.rawValue let centerX = ball.position.x let range = SKRange(lowerLimit: centerX, upperLimit: centerX) let constraint = SKConstraint.positionX(range) ball.constraints = [constraint] return ball } 

下面是一个以视觉forms解释问题的GIF: 在这里输入图像说明

问题是,如果球以一定angular度碰撞,则其总速度在新速度vector的垂直分量和水平分量之间被分开。 因为你限制了球的水平位置的运动,所以水平速度丢失了,球也不会反弹。

一种可能的解决scheme是重写场景中的didSimulatePhysics ,并检查球的速度是否不足以达到所需的高度。 如果不是的话,那就提高速度吧。

 let neededVelocity = sqrt(2 * physicsWorld.gravity.dy * (intendedHeight - ball.posiiton.y)) if ball.physicsBody.velocity.dy < neededVelocity && ball.physicsBody.velocity.dy > 0 { ball.physicsBody.velocity = CGVector(dx: 0, dy: neededVelocity) }