为什么这个SKPhysicsJointPin不会把这两个精灵放在一起?

我清楚地不明白SKPhysics的联合,但是networking上的信息很less,除了苹果文档。 下面的代码有什么问题,我认为应该保持头部和颈部的永久连接 – 我的意图是,他们的行为像一个针2纸,以便他们可以旋转一下,但不能完全分开。 当我运行这个代码的时候,他们掉到了他们所在的SKScene的底部,撞到了地面,然后头部掉下了身体。

也许这个关节并没有和他们一起移动,只是在他们移动的时候停留在原地。

self.head = [SKSpriteNode spriteNodeWithImageNamed:@"head.png"]; self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size]; self.head.physicsBody.mass = 0.05; self.head.physicsBody.dynamic = YES; self.chest = [SKSpriteNode spriteNodeWithImageNamed:@"chest_neck"]; self.chest.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.chest.size]; self.chest.physicsBody.mass = 0.05; self.chest.physicsBody.dynamic = YES; self.leftLeg = [SKSpriteNode spriteNodeWithImageNamed:@"left_leg"]; self.leftLeg.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftLeg.size]; self.leftLeg.physicsBody.mass = 10; self.leftLeg.physicsBody.dynamic = YES; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { self.head.position = CGPointMake(282, 220); self.chest.position = CGPointMake(282, 130); self.leftLeg.position = CGPointMake(282, 10); } else { self.head.position = CGPointMake(512, 380); self.chest.position = CGPointMake(512, 290); self.leftLeg.position = CGPointMake(512, 10); } [self addChild:self.head]; [self addChild:self.chest]; [self addChild:self.leftLeg]; self.chestJointPinAnchor = CGPointMake(self.chest.position.x, self.chest.position.y+39); self.chestJointPin = [SKPhysicsJointPin jointWithBodyA:self.head.physicsBody bodyB:self.chest.physicsBody anchor:self.chestJointPinAnchor]; [self.physicsWorld addJoint:self.chestJointPin]; 

这是因为你设置了它的physicsBody属性设置了精灵的位置。 我还没有在文档中发现任何提及,但是上周末我打破了我的想法,试图找出为什么我的手工创build的绳索工作,但recursion不是。 SpriteNodes的位置必须 physicsBody 之前设置。 所以,就像这样重新sorting你的代码:

 self.head = [SKSpriteNode spriteNodeWithImageNamed:@"head.png"]; self.chest = [SKSpriteNode spriteNodeWithImageNamed:@"chest_neck"]; self.leftLeg = [SKSpriteNode spriteNodeWithImageNamed:@"left_leg"]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { self.head.position = CGPointMake(282, 220); self.chest.position = CGPointMake(282, 130); self.leftLeg.position = CGPointMake(282, 10); } else { self.head.position = CGPointMake(512, 380); self.chest.position = CGPointMake(512, 290); self.leftLeg.position = CGPointMake(512, 10); self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size]; self.head.physicsBody.mass = 0.05; self.head.physicsBody.dynamic = YES; self.chest.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.chest.size]; self.chest.physicsBody.mass = 0.05; self.chest.physicsBody.dynamic = YES; self.leftLeg.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftLeg.size]; self.leftLeg.physicsBody.mass = 10; self.leftLeg.physicsBody.dynamic = YES; } 

哦,我注意到了,你已经find了自己的答案…你可以把你的问题标记为答案。

这似乎是正确的。

销接头允许两个主体围绕关节的锚点旋转。 一个真实世界的例子是一个模拟时钟。 或者是自行车的踏板。 或者一个车轮的车轴。

有一件事你必须知道,通过关节连接起来的身体不会相互碰撞。 尽pipe如此,您仍然可以使用销钉关节限制来防止头部在销钉关节固定器周围360度旋转。

好的,所以我发现这是Sprite Kit中的一个实际的错误。 解决方法是设置其物理体之前设置精灵的位置。 我做到了,并且如预期的那样完美运行。

此外,不要使上面所说的无效,但显然物理引擎假定场景的anchorPoint留在(0,0)处。 如果你改变它,物理引擎仍然会像(0,0)那样对待它。