在Sprite Kit中将关节添加到SKPhysicsWorld后无法更改SKPhysicsJointLimit maxLength

时间:2014-03-17 22:23:29

标签: sprite-kit skphysicsbody skphysicsworld

因此,我创建了一个SKSpriteNodes环,它基本上是使用针接头连接在一起的矩形。我想将这个戒指悬挂在SKShapeNode圈内。我已经使用SKPhysicsJointLimit将每个节点连接到SKShapeNode。

这一切都很好,如果我将maxLength设置为"右边"我会得到我正在寻找的效果。数字,我主观确定。

我已经存储了一个数组内的所有限制关节,因此我可以轻松访问,并且我已将它们添加到physicsWorld中。

所有这一切都正常并且正如预期的那样,尽管需要一些工作才能使代码正确。这些东西很挑剔!

现在,我真正想要做的是将maxLength设置为等于一个大数字,然后逐渐减少该数字,以便环从#34;松散地挂起"绷紧"拉扯"

我尝试了各种方法 - 但这些方法似乎都没有用。首先,我试过了:

SKAction *tighten = [SKAction customActionWithDuration:1 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
    CGFloat t = elapsedTime/duration;
    CGFloat p = t*t;
    CGFloat newLimit = fromLimit*(1-p) + toLimit*p;
    for (int i = 0; i < _connectors.count; i++){
        [[_connectors objectAtIndex:i] setMaxLength:newLimit];
    }
}];

[_ring runAction:tighten];

但这根本没有做任何事情。

我终于意识到,在将关节的属性添加到physicsWorld之后,您似乎无法更改关节的属性。所以,我在场景的更新方法中尝试了类似的东西:

        [scene.physicsWorld removeJoint:[_connectors objectAtIndex:i]];
        [[_connectors objectAtIndex:i] setMaxLength:newLimit];
        [scene.physicsWorld addJoint:[_connectors objectAtIndex:i]];

但是,这也没有用。它抛出了错误:

'Cant add joint <PKPhysicsJointRope: 0x114e84350>, already exists in a world'

尽管我已经明确删除了它。所以,我真的不知道从哪里开始。关于联合的文档和互联网上的现有材料非常薄。我想我接下来要做的就是删除所有关节并添加它们,但这将是一个巨大的痛苦。

任何想法都会非常有用!

1 个答案:

答案 0 :(得分:1)

如OP所述,在变更适用之前,必须从物理世界中移除关节。以下对我有用。

for joint in joints
{
    physicsWorld.removeJoint(joint)
    joint.maxLength = yourNewValue
    physicsWorld.addJoint(joint)
}