Swift SKPhysicsJointFixed不';t在移动节点时将节点保持在一起

Swift SKPhysicsJointFixed不';t在移动节点时将节点保持在一起,swift,sprite-kit,skphysicsjoint,Swift,Sprite Kit,Skphysicsjoint,我已经创建了2个SkSpritodes,并通过一个SKPhysicsJointFixed将它们连接起来,以使它们粘在一起。问题是当我将SKAction.move(by:,duration:)应用到第一个时,它会单独移动。为什么会这样?我怎样才能把它们移到一起?我搜索了很多,但似乎找不到任何新的或有用的信息。请帮忙。提前谢谢 代码如下: import SpriteKit class myGame: SKScene { var node1: SKSpriteNode! var node2: SK

我已经创建了2个SkSpritodes,并通过一个SKPhysicsJointFixed将它们连接起来,以使它们粘在一起。问题是当我将
SKAction.move(by:,duration:)
应用到第一个时,它会单独移动。为什么会这样?我怎样才能把它们移到一起?我搜索了很多,但似乎找不到任何新的或有用的信息。请帮忙。提前谢谢

代码如下:

import SpriteKit

class myGame: SKScene {

var node1: SKSpriteNode!
var node2: SKSpriteNode!

func createNode(_ position: CGPoint, color: UIColor) -> SKSpriteNode {
    let node = SKSpriteNode(color: color, size: CGSize(width: 50, height: 50))
    node.position = position
    node.physicsBody = SKPhysicsBody(rectangleOf: node.size, center: position)
    node.physicsBody?.affectedByGravity = false
    node.physicsBody?.allowsRotation = false
    return node
}

func setup() {
    node1 = createNode(.zero, color: .red)
    node2 = createNode(CGPoint(x: 0, y: -50), color: .green)
    self.addChild(node1)
    self.addChild(node2)

    let anchor = CGPoint(x: node1.size.width/2, y: -node1.size.height/2)
    let joint = SKPhysicsJointFixed.joint(withBodyA: node1.physicsBody!, bodyB: node2.physicsBody!, anchor: anchor)
    physicsWorld.add(joint)

}

override func didMove(to view: SKView) {
    setup()
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    node1.run(SKAction.move(by: CGVector(dx: 0, dy: 100), duration: 2))
}


}
导入SpriteKit
我的类游戏:SKScene{
变量节点1:SKSpriteNode!
变量节点2:SKSpriteNode!
func createNode(uu位置:CGPoint,颜色:UIColor)->SKSpriteNode{
let node=SKSpriteNode(颜色:颜色,大小:CGSize(宽度:50,高度:50))
node.position=位置
node.physicsBody=SKPhysicsBody(矩形:node.size,中心:位置)
node.physicsBody?.affectedByGravity=false
node.physicsBody?.allowsRotation=false
返回节点
}
函数设置(){
node1=createNode(.0,颜色:。红色)
node2=createNode(CGPoint(x:0,y:-50),颜色:。绿色)
self.addChild(节点1)
self.addChild(node2)
让锚点=CGPoint(x:node1.size.width/2,y:-node1.size.height/2)
让joint=skphysicjointfixed.joint(带bodyA:node1.physicsBody!,bodyB:node2.physicsBody!,锚点:锚点)
physicsWorld.add(关节)
}
覆盖func didMove(到视图:SKView){
设置()
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
node1.run(SKAction.move(by:CGVector(dx:0,dy:100),持续时间:2))
}
}

这确实很奇怪,但我以前也遇到过类似的情况。 是物理体上的AllowRotation造成了问题

修正:

注: 第二个节点的物理体有点偏离。我建议您这样做:

node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
并且您的关节当前位于节点的右角,请修复:

let anchor = CGPoint(x: 0, y: -node1.size.height/2)
除非你想让它像ofc:)

最后一个提示,如果你还不知道的话。在gameViewController中设置showPhysics以查看物理实体的轮廓。当你学习物理的时候,它确实很有帮助

view.showsPhysics = true

尝试通过物理(力或脉冲)移动这些节点,看看会发生什么……我认为这可能是因为您使用SKAction直接移动节点,而不是使用物理(即对物理体应用脉冲或力)。尝试将移动更改为冲量。非常确定以上两个都是正确的。@不,我使用了冲量和力,但仍然得到了相同的结果。这都是关于
。allowsRotation
。非常感谢!如果确实需要allowsRotation=false。可以使用距离约束。或者简单地更新第二个节点的位置,使其始终位于第一个节点的旁边。但真正的问题是节点不应该在我的应用程序中旋转:/n然后我建议使用距离约束
let con=SKConstraint.distance(SKRange(lowerLimit:50,upper limit:50),to:node1)node2.constraints=[con]
,您可以完全移除关节
view.showsPhysics = true