为什么这个SKPhysicsJointPin不能让这两个精灵在一起?

3
我对SKPhysicsJoint的理解不是很清晰,但是除了苹果文档以外,在网上找到的信息很少。以下代码有什么问题呢?我认为这段代码应该会使头和脖子永久连接在一起 - 我的意图是让它们像两张用别针连接的纸一样,可以旋转一点,但不能完全分离。当我运行这段代码时,它们掉落到它们所在的SKScene的底部,碰到地面,然后头从身体上掉下来。
也许这个joint没有跟随它们移动,而只是停留在原地?
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个回答

6
这是因为你在设置sprite的物理体属性之后,设置了它的位置。文档中没有提到这一点,但上周末我破费了心思,试图弄清楚为什么我手动创建的绳索可以工作,但递归创建的却不行。 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;


}

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


稍微重启一下这个线程。我也创建了一个递归绳索,在iOS7中没有任何问题。在iOS8中,突然当我的玩家抓住绳子时,绳子在所有接头处断裂。不知道发生了什么变化导致这种情况。 - James Paul Mason

2

这似乎是正确的。

销轴关节允许两个物体围绕关节锚点旋转。现实世界中的例子是模拟时钟、自行车踏板或汽车车轮轴。

需要知道的一件事是,通过关节连接的物体不会相互碰撞。但是可以使用销轴关节限制来防止头部在销轴锚点周围进行完整的360度旋转。


1
实际发生的情况是,当头部/胸部落到场景底部时,头部会短暂地旋转,但随后完全与胸部分离,并远离它。这个关节本身应该只附着在两个精灵上并随它们一起移动,对吧? - Cocorico

1

好的,我发现这是Sprite Kit中的一个实际bug。修复方法是在设置物理体之前设置精灵的位置我这样做了,它完美地工作了,就像预期的那样。


0
此外,不否认上面所说的内容,但显然物理引擎假定场景的anchorPoint保持在(0, 0)。如果您将其更改为其他值,物理引擎仍将像(0, 0)一样处理它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接