3

我显然不太了解 SKPhysicsJoint,但是除了 Apple 文档之外,网络上的信息还很少。下面的代码有什么问题,我认为应该让头部和颈部永久连接 - 我的意图是它们就像两张带别针的纸一样,这样它们就可以旋转一点,但不仅仅是完全分开. 当我运行这段代码时,它们掉到他们所在的 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

4 回答 4

6

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

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;


}

哦,我注意到了,您已经自己找到了答案……您能否将您的问题标记为已回答。

于 2013-11-18T10:47:09.350 回答
2

这似乎是对的。

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

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

于 2013-10-29T19:05:14.963 回答
1

好的,所以我发现这是 Sprite Kit 中的一个实际错误。修复方法是在设置其物理体之前设置精灵的位置。正如预期的那样,我做到了,并且效果很好。

于 2013-10-30T00:14:52.610 回答
0

此外,并没有使上述内容无效,但显然物理引擎假定场景的锚点位于 (0, 0)。如果您将其更改为其他内容,物理引擎仍会将其视为 (0, 0)。

于 2014-12-19T20:51:32.963 回答