为什么这个SKPhysicsJointPin不会将这两个精灵保持在一起?

时间:2013-10-29 18:48:22

标签: ios sprite-kit skphysicsbody

我显然不太了解SKPhysicsJoint,但是除了Apple文档之外,网上的信息还很少。以下代码有什么问题,我认为这应该保持头部和颈部永久连接 - 我的意图是它们像带有别针的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];

4 个答案:

答案 0 :(得分:4)

这是因为你设置了它的physicsBody属性后设置精灵的位置 。 我没有在文档中发现任何提及,但我上周末试图弄清楚为什么我的手动创建的绳索工作,但递归地没有。 SpriteNodes的位置必须在之前设置物理实体。 所以,只需按照以下方式重新排序代码:

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;


}

哦,我注意到了,你已经找到了自己的答案......请你把问题标记为答案。

答案 1 :(得分:2)

这似乎是正确的。

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

您必须知道的一件事是通过关节连接的身体不会相互碰撞。您可以使用针接头限制来防止头部在针接头锚固件周围进行360度旋转。

答案 2 :(得分:1)

好的,所以我发现这是Sprite Kit中的一个实际错误。修复是在设置其physicsBody之前设置精灵的位置。我这样做了,它完美地工作,正如预期的那样。

答案 3 :(得分:0)

此外,不会使上述内容无效,但显然物理引擎假设场景的anchorPoint保留在(0,0)。如果将其更改为其他内容,物理引擎仍会将其视为(0,0)。