因此,我创建了一个SKSpriteNodes环,这些环实际上是使用销钉连接在一起的矩形。我想将此环挂在SKShapeNode圆内。我已经使用SKPhysicsJointLimit将每个节点连接到SKShapeNode。

一切正常,如果将maxLength设置为“主观上”的“正确”数字,我将获得想要的效果。

我已经将所有极限关节存储在Array中,因此我可以轻松访问,并将它们添加到PhysicalWorld中。

所有这些工作都能正常运行,并且符合预期,尽管花了一些时间才能使代码正确。这些东西很挑剔!

现在,我真正想做的是将maxLength设置为一个较大的数字,然后随着时间的推移逐渐减小该数字,以使戒指从“松散悬挂”变为“拉紧拉紧”

我尝试了多种方法-似乎都不起作用。首先,我尝试:

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];


但这根本什么也没做。

我终于意识到,将关节添加到PhysicalWorld后,您似乎无法更改其属性。因此,我在场景的更新方法中尝试了类似的方法:

        [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'


即使我已经清楚地删除了它。所以,我真的不知道从这里出发。有关关节的文档以及互联网上的现有材料非常薄。我想接下来要尝试的是删除所有关节并添加它们,但这将是一个巨大的痛苦。

任何想法都将非常有帮助!

最佳答案

正如OP所指出的,在进行更改之前,必须从物理世界中移除关节。下面为我​​工作。

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

10-06 07:21