这个问题很可能与这个问题有关。但是,我没有足够的声誉来添加该讨论。
当固定节点的 zRotation 在场景空间中达到(或可能接近)正或负 PI并且 node.physicsBody.allowRotation = false 时,节点的局部 zRotation 立即跳转到负或正 5.497...弧度,具体取决于在旋转方向上。
如果节点正在移动,则视觉结果是节点链翻转、抖动和/或通常行为不端。
如果节点没有移动,结果仍然会发生,但没有明显的视觉效果。
我在下面的一个小测试用例中重新创建了这个问题。
编辑:这个问题似乎仅限于身体被固定在一系列的地方。我在这里看到了节点嵌套的地方,以及节点具有相同父级并手动固定在一系列中的地方。
编辑 2:将测试用例更改为在更新序列过程中输出节点 zRotation 值。
编辑 3:与 Apple 确认这是一个错误。
import SpriteKit
class GameScene: SKScene {
var nodes :[SKNode]
required init?(coder aDecoder: NSCoder) {
nodes = Array<SKNode>()
super.init(coder: aDecoder)
}
override func didMoveToView(view: SKView) {
NSLog("Create nodes")
physicsWorld.speed = 0.5
var prev = self as SKNode
var newNode:SKShapeNode
for n in 0...5{
newNode = SKShapeNode(circleOfRadius: 20)
newNode.name = String(n)
newNode.position = (n==0 ? CGPoint(x: 400, y: 400):CGPoint(x: 50, y: 0))
newNode.zRotation = CGFloat(M_PI/4)
prev.addChild(newNode)
prev = newNode
newNode.physicsBody = SKPhysicsBody(circleOfRadius: 20, center: CGPoint(x: 0, y: 0))
newNode.physicsBody?.affectedByGravity = true
newNode.physicsBody?.dynamic = (n==0 ? false : true)
newNode.physicsBody?.pinned = true
newNode.physicsBody?.affectedByGravity = false
newNode.physicsBody?.allowsRotation = (n==1 ? true : false) // allowing rotation removes issue
newNode.physicsBody?.collisionBitMask = 0x00000000
nodes.append(newNode)
NSLog("node \(newNode.name):\(newNode.zRotation)")
}
}
override func update(currentTime: NSTimeInterval) {
NSLog("update")
for node in nodes{
NSLog("node \(node.name):\(node.zRotation)")
}
}
override func didEvaluateActions() {
NSLog("didEvaluateActions")
for node in nodes{
NSLog("node \(node.name):\(node.zRotation)")
}
}
override func didSimulatePhysics() {
NSLog("didSimulatePhysics")
for node in nodes{
NSLog("node \(node.name):\(node.zRotation)")
}
}
override func didApplyConstraints() {
NSLog("didApplyConstraints")
for node in nodes{
NSLog("node \(node.name):\(node.zRotation)")
}
}
}
输出:
Create nodes
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):0.785398185253143
node Optional("4"):0.785398185253143
node Optional("5"):0.785398185253143
update
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):0.785398185253143
node Optional("4"):0.785398185253143
node Optional("5"):0.785398185253143
didEvaluateActions
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):0.785398185253143
node Optional("4"):0.785398185253143
node Optional("5"):0.785398185253143
didSimulatePhysics
node Optional("0"):0.785398185253143
node Optional("1"):0.785398185253143
node Optional("2"):0.785398185253143
node Optional("3"):-5.49778699874878 <<<<<
node Optional("4"):0.785398006439209
node Optional("5"):0.785398006439209