Ios SKPhysicsJoint使旋转无法正常工作

Ios SKPhysicsJoint使旋转无法正常工作,ios,swift,rotation,sprite-kit,skphysicsjoint,Ios,Swift,Rotation,Sprite Kit,Skphysicsjoint,通过使用Swift和Sprite工具包,我试图在名为“pin”的静态SKSpriteNode的位置和用户触摸屏幕的任何位置之间创建一条具有真实物理效果的绳索。为此,我添加了称为ropeNodes的单个SkSpritodes,并将它们与一系列SkPhysicsJointPin连接起来。物理效果很好,但是,当我尝试旋转每个单独的部分以使它们正确定向时,绳索节点不再形成直线,也不会旋转到正确的角度。然而,当我移除SKPhysicsJoints时,旋转将按照每个单独节点的预期方式工作。在每个单独的绳索节

通过使用Swift和Sprite工具包,我试图在名为“pin”的静态SKSpriteNode的位置和用户触摸屏幕的任何位置之间创建一条具有真实物理效果的绳索。为此,我添加了称为ropeNodes的单个SkSpritodes,并将它们与一系列SkPhysicsJointPin连接起来。物理效果很好,但是,当我尝试旋转每个单独的部分以使它们正确定向时,绳索节点不再形成直线,也不会旋转到正确的角度。然而,当我移除SKPhysicsJoints时,旋转将按照每个单独节点的预期方式工作。在每个单独的绳索节点的锚点周围移动似乎只会使事情变得更加混乱。为什么会发生这种情况,我如何着手解决它?提前感谢(:

override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
/*当触摸开始时调用*/
用于触摸输入(触摸设置为){
let location=touch.locationInNode(自)
dx=销位置.x-位置.x
dy=销位置.y-位置.y
设长度=sqrt(功率(dx!2)+功率(dy!2))
让开放节点之间的距离=40
设numberOfPieces=Int(长度)/开放节点之间的距离
变量ropeNodes=[SKSpriteNode]()
//将片段添加到阵列和场景的相应位置
对于var指数=0;指数SKSpriteNode{
让ropeNode=SKSpriteNode(图像名为:“RopeTexture”)
ropeNode.physicsBody=SKPhysicsBody(矩形尺寸:ropeNode.size)
ropeNode.physicsBody?.affectedByGravity=false
ropeNode.physicsBody?.collisionBitMask=0
ropeNode.position=位置
ropeNode.name=“RopePiece”
返回节点
}
这是当我尝试旋转每个单独的Rope节点时发生的情况的图像


经过深思熟虑后,我认为将表示节点添加为子节点是一个更好的主意,因为您不需要在单独的数组中跟踪额外的节点。要设置子节点的旋转,只需松开父节点的旋转,然后添加新的旋转角度:

node.zRotation = -node.parent!.zRotation + newRotation
如果绳索段位于容器
SKNode
中,则可以通过

for rope in ropes.children {
    if let node = rope.children.first {
        let newRotation = ...
        node.zRotation = -rope.zRotation + newRotation
    }
}

您可能需要向每个绳索段添加一个“演示”节点。演示节点是另一个节点的可视表示,您可以更改(例如,旋转)不影响实际节点的物理特性。因此,基本上添加没有physicsBody且只有纹理的节点来代替现有的ropeNodes?是的,将它们的位置设置为与
didSimulatePhysics
中的绳索段相同,并使具有实体的绳索节点不可见。这可能会起作用,但需要我保持移动在每一帧将纹理旋转到正确的位置,因为它们实际上没有任何物理特性。这将非常低效。另一种方法是添加一个旋转的子节点,但您需要反向旋转父节点,然后将子节点旋转到所需的角度。我基本上就是这样做的。我只是添加了
let text=SKSpriteNode(ImageName:“RopeTexture”)text.runAction(SKAction.rotateByAngle(atan2(-dx!,dy!),持续时间:0))ropeNode.addChild(text)
到我的createRopeNode()方法
for rope in ropes.children {
    if let node = rope.children.first {
        let newRotation = ...
        node.zRotation = -rope.zRotation + newRotation
    }
}