简单的设置-我有反弹球节点(蓝色)和静态球节点(绿色)。灰色框具有物理实体SKPhysicsBody(edgeLoopFrom: box.frame)
,因此它限制了弹跳球向外部移动。我在创建时将弹跳球节点(蓝色)的速度设置为随机CGVector
,它开始移动。它从静态球节点(绿色)和灰色框的边缘反弹。
我对所有节点的常规SKPhysicsBody
设置是:
node.physicsBody?.restitution = 1
node.physicsBody?.friction = 0.0
node.physicsBody?.linearDamping = 0.0
node.physicsBody?.angularDamping = 0.0
我的问题是:如何确保弹跳球确实以恒定的速度运动?几次反弹后,该节点要么加速,要么减速。
答案 0 :(得分:0)
为了实现这一点,只要物理引擎检测到碰撞,我都会对向量进行归一化。因此,在func didBegin(_ contact: SKPhysicsContact)
中,会发生以下情况:
let length = hypotf(Float(node.velocity.dx), Float(node.velocity.dy))
let multiplier = (290.0 / length)
firstBody.velocity.dx *= CGFloat(multiplier)
firstBody.velocity.dy *= CGFloat(multiplier)
290.0
是确定球速的任意值。
作为参考,请选中this answer。