如何像轮子一样旋转 SKPhysicsBody

How to rotate a SKPhysicsBody like a wheel

我的目标是像电机驱动的轮子一样旋转圆形节点,例如顺时针旋转时,由于地板的摩擦力,轮子会向右移动。

根据其他线程,旋转 SKPhysicsBody 的方法是旋转它所连接的主体。

此代码旋转精灵而不是物理体。我该如何解决这个问题?

let circle = SKSpriteNode(imageNamed: ”circle")
circle.position = CGPoint(x: size.width * 0.5, y: size.height * 0.9)
circle.physicsBody = SKPhysicsBody(circleOfRadius: circle.frame.width/2)
if let physics = circle.physicsBody {
    physics.affectedByGravity = true
    physics.allowsRotation = true
    physics.restitution = 0.2
    physics.friction = 1.0
    physics.isDynamic = true;
    physics.mass = 10
}
addChild(circle)
let rotateAction = SKAction.rotate(byAngle: .pi, duration: 1.0)
let repeatAction = SKAction.repeatForever(rotateAction)
circle.run(repeatAction)

PS。这种创建正文的方法在 iOS 13 中不起作用,但应该不会影响结果。

circle.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: ”circle"), size: circle.size)

使用“applyAngularImpulse”,而不是 SKActions。同时将“allowsRotation”设置为 true

虽然直接移动或旋转 sprite 也会移动物理 body,但物理引擎可以为您移动 sprite,因此您不必担心。理念是让它完成工作,而不是添加动作来直接创建动作。

如果你想要一个附有 body 的精灵旋转,要么对 body 应用 angular 脉冲(如 Knight0fDragon 所建议),要么只设置物理 body的angular速度直接。如果您不想停止旋转,您可能还想将 angularDamping 设置为 0。例如,

...
addChild(circle)
circle.physicsBody?.angularDamping = 0
circle.physicsBody?.angularVelocity = .pi
...

然后删除 circle.run(...) 看看会发生什么。